Checbox state by object sender

0

Witam

Kombinuję jak poprzez sparametryzowanie kontrolek wykonywać operacje na nich bez korzystania z odwołań do deklaracji nazwy.

Dla kontrolek label zadziałało spokojnie

control = (Control)sender;

po tej operacji mogę przekazać zmienną control do metody zewnętrznej i operować niezbędnymi atrybutami - Text, BackColor, ect.
przykład: - przejmuję zdarzenia click dla kontrolek label i dzięki parametryzacji obsługuję 90 szt 1 elegancką metodą

        private void EdytowanyDzień(Control control, MouseEventArgs e)
        {
            if (control.Text == "")
            {
                return;
            }

            if (control.Text != "")
            {
                CzyKlikniętoInnyLabel(control.Name);

                if (e.Button == MouseButtons.Left)
                {
                    control.BackColor = Color.Yellow;
                    UzupełnijLabeleInformacyjne(wybranyRok, wybranyMiesiąc, control.Text);
                }
                else
                if (e.Button == MouseButtons.Right)
                {
                    if (control.BackColor == Color.DarkGray)
                    {
                        return;
                    }
                    else
                    if (control.BackColor == Color.Yellow)
                    {
                        CMS_ModyfikacjaDnia.Show(Cursor.Position);
                    }
                    else
                        return;
                }
            }
        }

Próbuję użyć tego samego dla kontrolek CheckBox - ale nie da się wywołać właściwości .Checked i jej sprawdzać.

Czy jest jakaś metoda na sparametryzowanie większej ilości takich kontrolek poprzez object sender?
I w efekcie uzyskać coś na kształt:

control.Checked = ... ?

PB

0

musisz sprawdzić czy sender jest CheckBox i jeśli tak to musisz go rzutować na CheckBox a nie na Control

if (Sender is CheckBox)
{
  ((CheckBox)Sender).Checked = true;
}
0

... dopiero siadłem

przetrawiłem Twoja podpowiedź, pokombinowałem i wyszło coś takiego..

wszystkie 48 kontrolek CheckBox :

            Checkbox = ((Control)sender);

            WybranaGodzina(Checkbox, e);

a metoda je obsługująca wspólnie:

        private void WybranaGodzina(Control godzina, EventArgs e)
        {
            switch (wybranaFunkcja)
            {
                case 42:
                    {
                        if (((CheckBox)godzina).Checked == false)
                            GodzinyPrzyjścia[wybranaGodzina] = 0;
                        else
                            GodzinyPrzyjścia[wybranaGodzina] = 1;
                    }
                    break;
                case 33:
                    {
                        if (((CheckBox)godzina).Checked == true)
                        {
                            ZaznaczonoGodzinę(wybranaGodzina, wybranyDzień, wybranyMiesiąc);
                        }
                        else
                        if (((CheckBox)godzina).Checked == false)
                        {
                            ZaznaczonoGodzinę(0, wybranyDzień, wybranyMiesiąc);
                        }
                    }
                    break;
            }
        }

Dzięki za podpowiedź i miłej nocki :-)

0

Jeżeli metoda operuje wyłącznie na CheckBoxach lub ich potomkach to jako parametr właśnie taki typ powinna przyjmować.
BTW nigdzie nie sprawdzasz, czy godzina rzeczywiście jest typu CheckBox co grozi pięknym wywaleniem
BTW2 skąd się biorą u was (nie wiem o co chodzi ale jest spora grupa osób, pisząca w różnych językach i lubująca się w porównywaniu zmiennej logicznej do true w różnego rodzaju warunkach) takie warunki Checked == true??? to już samo Checked nie wystarczy? Za mało mainstreamowe jest czy jak? A już to

                        if (((CheckBox)godzina).Checked == true)
                        {
                            ZaznaczonoGodzinę(wybranaGodzina, wybranyDzień, wybranyMiesiąc);
                        }
                        else
                        if (((CheckBox)godzina).Checked == false)
                        {
                            ZaznaczonoGodzinę(0, wybranyDzień, wybranyMiesiąc);
                        }

to jest mistrzostwo. Odrobina dbałości o to aby kod jakkolwiek wyglądał.

0

Po rzutowaniu warto sprawdzac czy mie dostajesz nulla jo samo
((CheckBox)sender).Checked
Moze wywalic najglupsze exception ever.

0

Dzięki za podpowiedzi.
Co do sprawdzania stanu - tak mi to kiedyś pokazano, ponieważ znaczenie może mieć i czy kontrolka jest i czy nie jest zaznaczona, i jedno i 2-gie zdarzenie może wywoływać konsekwencje.
Pewność, że wywołuje tylko CheckBox, Label, czy ToolStripMenuItem mam, ponieważ zadeklarowałem odpowiednie pola dla każdej klasy kontrolek, i jednocześnie mogę operować kilkoma.
Jeśli kiedyś ktoś da mi szansę rozwijać się jako regularny programista, to zapewne szybko nabiorę ogłady.
Na razie staram się jak mogę, ucząc się, nabierając wprawy i odkrywając kolejne ciekawe obszary w zaciszu gabinetu :-)

A pro-po problemów.

Teraz dodałem dynamiczne nadrukowywanie kontrolek uzależnione od konfiguracji, i źle pozycjonuje mi pierwszą kontrolkę, pomimo wyraźnego zdefiniowania położenia. Opiszę to jutro, i podwieszę. Może ktoś wpadnie na pomysł czemu tak się dzieje.

Życzę miłej nocy i jeszcze raz dziękuję za podpowiedzi.

0
BPiotr napisał(a):

Co do sprawdzania stanu - tak mi to kiedyś pokazano, ponieważ znaczenie może mieć i czy kontrolka jest i czy nie jest zaznaczona, i jedno i 2-gie zdarzenie może wywoływać konsekwencje.

Kompletnie nie o to chodzi - to Checked == true to jest to samo co Checked a to Checked == false to jest to samo co !Checked

Pewność, że wywołuje tylko CheckBox, Label, czy ToolStripMenuItem mam, ponieważ zadeklarowałem odpowiednie pola dla każdej klasy kontrolek, i jednocześnie mogę operować kilkoma.

Nie masz pewności! A jak ktoś weźmie tę twoją klasę i przekaże zamiast CheckBox np. Button to masz wyjątek!

Jeśli kiedyś ktoś da mi szansę rozwijać się jako regularny programista, to zapewne szybko nabiorę ogłady.

"Ogłady" należy nabierać od samego początku a Ty zamiast "ogłady" nabierasz i utrwalasz złe nawyki.

1

Dobra, to dostałem bure - tylko czy zasłużoną?

Obudziłeś się i byłeś wymiataczem?

Sądzę, że na burę nie zasłużyłem, ale podpowiedzi chętnie przyjmę.

teraz ja sprzedam burę. Odrobinę więcej szacunku do innych, i jeśli chcesz pomagać, co jest chwalebne, to rób to elegancko, bo pomaganie na zasadzie - patrzcie on jest łysy - to raczej dyskryminacja, a nie pomaganie, lepiej zadać pytanie, czy próbowałeś zrobić coś z włosami.

I tym razem, życzę miłego dnia.

0
private void WybranaGodzina(Control godzina, EventArgs e)
        {
            switch (wybranaFunkcja)
            {
                case 42:
                    {
                        if (((CheckBox)godzina).Checked == false)
                            GodzinyPrzyjścia[wybranaGodzina] = 0;
                        else
                            GodzinyPrzyjścia[wybranaGodzina] = 1;
                    }
                    break;

Jeśli ta metoda przyjmuje CheckBox-a tylko po to, żeby sprawdzić jego Checked to IMHO lepiej przekazać do nie bool-a. Bo teraz najpierw rzutujesz CheckBox-a na Control, żeby wysłać do metody, a w metodzie rzutujesz Control na CheckBox-a, żeby sprawdzić jego Checked. Wtedy sama metoda nie będzie zależna od żadnych obiektów UI (bo nie operuje na żadnych obiektach UI, więc nie ma sensu ich do niej wpychać)..

Poza tym unikaj takich zapisów case 42:... Bo co to jest "42"? ma to jakieś znaczenie (jak np rozmiar buta, wiek). Zrób może jakiś czytelniejszy enum do tego.

0

Ok
Śliczne dzięki za podpowiedź. Postaram się to przetrawić jeszcze dziś.

Podwiesiłem kolejny problem na forum, i będę wdzięczny również tam o pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1