Weryfikacja i ustawianie właściwości textBox i checkBox

Weryfikacja i ustawianie właściwości textBox i checkBox
MU
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 7 lat
  • Postów:4
0

Witam,
poproszę o podpowiedź jak zrealizować poniższą funkcjonalność.
Na formularzu (Windows Form) mam umieszczonych kilka par kontrolek checkBox i textBox (dla uproszczenia opisywać będę tylko dwie pary) czyli:
checkBox1 i odpowiadający mu textBox1
checkBox2 i odpowiadający mu textBox2
Dla każdej z par w momencie zaznaczania checkBox'a ustawiam Fokus na odpowiadający mu textBox.
Funkcjonalność na której mi zależy, to nie dopuścić by na formularzu znajdowała się para: zaznaczony checkBox i odpowiadający jemu textBox bez fokusa (kursora) i bez wprowadzonego tekstu.
Realizuję to poprzez wykorzystanie zdarzenie textBox_Validating. W zdarzeniu tym sprawdzam, czy długość tekstu w textBox jest równa 0. Jeśli tak to ustawiam checkBox.Checked na 'false' (czyli w momencie opuszczania textBoxa, jeśli nie ma w nim tekstu, odznaczam checkBox) np.:

  1. Klikam w niezaznaczony chkBox1 (zaznaczam go). W zdarzeniu checkBox.CheckedChanged ustawiam fokus na textBox (textBox1.Fokus()).
  2. textBox1 otrzymuje fokus czyli pojawia się w nim kursor do wprwadzania tekstu, ale TextBox1 jest "pusty" - nie ma jeszcze wprowadzonego tekstu.
  3. Jeśli teraz kliknę w checkBox2, jako pierwsze, wywołane jest zdarzenie TextBox1_Validating w którym sprawdzam, że ChekBox1.Checked jest true i ponieważ textBox1.text.Lengt==0, to ustawiam checkBox1.Checked na false. Wszystko jest OK.
    Problem zaczyna się jeśli jestem w sytuacji opisanej w punkcie 2. i
  4. Jeśli teraz kliknę nie w checkBox2, a w checkBox1 (czyli chcę "odznaczyć" checkBox1), to "odznaczenie" to nie przynosi efektów - checkBox1 cały czas jest zaznaczony
    Poniżej kod dwóch method obsługujących zdarzenia.
Kopiuj
        private void checkBox1_CheckedChanged(object sender, EventArgs e) {
            if (((CheckBox1)sender).Checked) {
                textBox1.Focus();
            }
            else {
                textBox1.Text = "";
            }
        }

        private void textBox1_Validating(object sender,CancelEventArgs e) {
                if ((sender as TextBox1).TextLength == 0) {
                    checkBox1.Checked = false;
                }
        }

Czy jest jakiś sposób (być może inne rozwiązanie) by zrealizować powyższą funkcjonalność?
Wszystkie deklaracje metod obsługi zdarzeń są wygenerowane przez VisualStudio

edytowany 1x, ostatnio: muszkamuszka
JU
  • Rejestracja:około 22 lata
  • Ostatnio:29 dni
  • Postów:5042
0

Jest. Normalny sposób :)

Rozwiązania masz przynajmniej dwa:

  1. Moim zdaniem lepsze - wykorzystaj UserControl. To coś w rodzaju własnego komponentu, ale nie do końca. Tworzysz nowy UserControl i na początek widzisz jakby panel, na którym kładziesz sobie kontrolki. Wszystko możesz oprogramować tak, jak chcesz, np:
Kopiuj
void checkBox_CheckedChanged(...)
{
   textBox.Focus();
}

Tworzysz sobie jakąś publiczną metodę Validate, w której po prostu sprawdzasz:

Kopiuj
if(string.NullOrEmpty(textBox.Text.Length))
  checkBox.Checked = false;

Potem na swojej formie kładziesz kilka tych kontrolek, ile potrzebujesz. A na koniec musisz tylko wywołać validate. Robisz to oczywiście w pętli.

  1. Zdecydowanie gorszy sposób:
    Do każdego checkBoxa przypisujesz we właściwości TAG odpowiadający mu textBox.
    Każdy checkBox ma to samo zdarzenie checkedChanged:
Kopiuj
CheckBox cb = sender as CheckBox;
if(cb != null && cb.Checked)
{
  TextBox tb = cb.Tag as TextBox;
  if(tb != null)
    tb.Focus();
}

Trudniej będzie w drugą stronę. TextBoxy też powinny mieć w tagu odpowiadającego CheckBoxa. Dlatego najlepiej to zrobić za pomocą UserControl.

MU
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 7 lat
  • Postów:4
0

Dziękuję za podpowiedź.
Zacząłem próby z UserControl i na razie po jego utworzeniu, pojawia mi się błąd w momencie kiedy wstawiam go na moją Formę (zakładam, że może jakoś sobie z tym poradzę). Jednak mam jeszcze inną wątpliwość. Jeśli dobrze zrozumiałem Twój opis wariantu "lepszego" kontrolka UserControl posłużyć ma do "sparowania" checkBox'a i textBox'a, natomiast metoda Validate ma posłużyć do sprawdzenia nieprawidłowych wartości (pusty textBoch przy "zahaczonym" checkBox'ie) uruchamiana np przed pobraniem wartości z pól. Wydaje mi się, że takie rozwiązanie nie daje możliwości weryfikacji złych ustawień dynamicznie - tzn podczas opuszczania textBoxa (być może nieprecyzyjnie napisałem, ale o taką funkcjonalność mi chodzi). Jeśli się mylę to poproszę o dodatkowe wskazówki, jeśli nie to może jakiś kolejny sposób.

JU
  • Rejestracja:około 22 lata
  • Ostatnio:29 dni
  • Postów:5042
0

Jeśli chcesz podczas opuszczania textboxa, to przecież możesz to oprogramować na poziomie usercontrol :| Potraktuj user control tak, jakby było osobną formą, na którą kładziesz komponenty. A potem możesz na innej formie położyć mnóstwo tych user control. I wszystko stanie się jasne.

MU
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 7 lat
  • Postów:4
0

Tylko problem w tym oprogramowaniu :). Wydaje mi się, że problem ten pojawi się niezależnie czy kontrolki będą bezpośrednio na formularzu, czy w UserControl (jak sam piszesz UserControl jest jakby niezależnym formularzem).
A może spróbujmy znaleźć rozwiązanie patrząc z innej strony.
Mam tylko dwie kotrolki: Textbox1 i CheckBox1. Chekbox1 ma status Checked, natomiast fokus ustawiony jest na Textbox1.
I teraz klikam myszką w ChekBox1 tak by go odznaczyć. Z tego co mi się udało zorientować najpierw pojawiają się zdarzenia związane z utratą fokusa w TextBox1 (Validating, Validated, Leave), a dopiero później związane z CheckBox1 (CheckedChange i Click). W związku z tym, jeśli opuszczając TextBox1 zmieniam stan na "uncheked" i dopiero potem pojawia się obsługa klikniętego CheckBox1, to zamiast odznaczenia, zostaje on ponownie zaznaczony.
I teraz pytanie: W jaki sposób obsługując zdarzenie wyjścia z TextBox1 (np Leave) można sprawdzić, kliknięcie której kontrolki, spowodowało utratę fokusa przez TextBox1. Czytałem że są kolejki zdarzeń i komunikatów (w których zapewne czekają na obsługę zdarzenia związane z CheckBox1 - po zakończeniu zdarzeń TextBox'a), ale jak się do nich "dobrać"? (Niestety obiekt sender przesłany jako argument, w metodzie obsługującej zdarzenie Leave, wskazuje na TextBox1).

JU
  • Rejestracja:około 22 lata
  • Ostatnio:29 dni
  • Postów:5042
0

Czekaj, od samego początku masz jakieś błędne założenie. Teraz się wczytałem:

Funkcjonalność na której mi zależy, to nie dopuścić by na formularzu znajdowała się para: zaznaczony checkBox i odpowiadający jemu textBox bez fokusa (kursora) i bez wprowadzonego tekstu.

Z tego wynika, że chcesz mieć taką sytuację, w której każdy zaznaczony checkbox będzie miał textbox z focusem? Tylko jedna kontrolka może mieć focus w danym momencie.

Co konkretnie chcesz osiągnąć?

edytowany 1x, ostatnio: Juhas
MU
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 7 lat
  • Postów:4
0

Kurczę, wczytałeś się w pierwszy post i faktycznie tam nie jest precyzyjny opis.
Spróbuję jeszcze raz (załączam plik z przykładowym formularzem).
Założenie jest takie: jeśli checkbox nie jest zaznaczony to textbox po prawej stronie checkboxa'a nie jest aktywny (enable=false), natomiast jeśli chckbox jest zaznaczony to odpowiadający mu textbox jest aktywny, ale nie może być pusty (jedyny wyjątek to moment kliknięcia w checkboxa i przeniesienia focusa do pustego textboxa)).
Przykład (z załączonego pliku) pokazuje stan tuż po kliknięciu w checkbox2. Checkbox2 został zaznaczony, a zmiana statusu checkboxa2 spowodowała przeniesienie fokus'a do sąsiadującego textbox'a. Teraz mogę:1) wpisać coś do textboxa i z niego wyjść lub 2) wyjść z textboxa nic nie wpisując. Skupmy się na przypadku 2). Załóżmy (na razie), że wyjście z textboxa realizujemy przy pomocy myszki (a nie klawiatury) klikając w jedną z pozostałych aktywnych kontrolek. Wychodząc z textboxa, chcę sprawdzić czy został wpisany jakiś text. Jeśli nie ma, to muszę zdjąć (programowo) zaznaczenie z checkboxa2 (tak aby nie było sytuacji, że jest zaznaczony chackbox a textbox jest pusty).
I to właściwie wszystko.
Wszystko jest OK, gdy wyjście z textboxa jest spowodowane kliknięciem w dowolną aktywną kontrolkę poza checkbox2. Natomiast klikniecie w zaznaczony checkbox2 nie powoduje zdjęcia zaznaczenia (chociaż mrugniecie checkboxa wskazuje na to, że zaznaczenie jest (programowo) zdjęte, ale zaraz potem jest realizowane kliknięcie w checkbox (tyle że jest on już programów odznaczony i de facto klikniecie zamiast go odznaczyć - zaznacza go ponownie). Dlatego program powinien wiedzieć (opuszczając textbox), w którą kontrolkę nastąpiło klikniecie. Wtedy realizowałbym odznaczenie tylko wtedy jeśli nie kliknięto checkbox2, a jeśli kliknięto, to odznaczenia programowego nie przeprowadzałbym (odznaczenie checkbox2, nastąpi poprzez jego klikniecie).
Nie wiem czy coś Ci rozjaśniłem ?

JU
  • Rejestracja:około 22 lata
  • Ostatnio:29 dni
  • Postów:5042
0

Teraz już wiem o co Ci chodzi. CheckBox jest odznaczany, ale natychmiast następuje jego zaznaczenie. Nie mogę wymyślić nic sensownego, bo zawsze jest jakiś problem. Ale pokombinowałbym z:
CheckBox.AutoCheck
CheckBox.Validating
CheckBox.CheckStateChanged

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)