Jak sprawdzić indeks zaznaczonego CheckBoxa, który został stworzony w innej klasie.

0

Witam, tworzę w WPF rozkład siedzeń w sali, Kod jest bardziej rozbudowany bo wyciąga jeszcze dane z bazy o zarezerwowanych biletach itd. Więc skróciłem go aby był bardziej czytelny.

Jak mam sprawdzić, który CheckBox został zaznaczony aby zapisać nr wiersza i kolumny do bazy danych?

To jest tworzenie mapki sali:


List<CheckBox> CheckBoxList = new List<CheckBox>();

for (int i = 0; i < kolumny; i++)
{
     WrapPanel wp = new WrapPanel();

      for (int j = 0; j < wiersze; j++)
      {
          CheckBoxList.Add(new CheckBox());
          wp.Children.Add(CheckBoxList[counter]);
          counter++;
      }
}

Tam wcześniej w interfejsie wybiera się ile biletów chce kupić klient dlatego, metoda blokuje mu zaznaczanie checkboxów gdy przekroczy limit:

No i uważam, że tutaj oprócz sprawdzania czy limit został osiągniety, powinno być sprawdzenie tego, który CheckBox został zaznaczony, tylko że nie mam pojęcia jak to wyciągnąć.

Mogę jakoś w tej metodzie CheckBox_Checked sprawdzić np:

ChechBoxList**[CO TU SIE ZNAJDUJE]** indeks zaznaczonego CheckBoxa?

private void CheckBox_Checked(object sender, RoutedEventArgs e)
            {
                a++;

                if(a >= counter)
                {
                    StackPanelForMap.IsEnabled = false;
                }
            } 
0

Albo przypisać ten numer do właściwości Tag comboboxa albo użyć CheckBoxList.IndexOf w argumencie podając sender w zdarzeniu.

1

Zacznę od tego, że WrapPanel nie jest chyba najlepszym komponentem do przechowywania miejsc w porządku rząd/miejsce. Zdecdowanie bardziej nadaje się do tego chociażby Grid, który pozwala zachować strukturę wierszy i kolumn niezależnie od zmiany rozmiaru. WrapPanel będzie Ci zawijał miejsca do sąsiednich rzędów.

Wracając do tematu i dla uproszczenia pozostawiając to na WrapPanelu...
Ja bym to zrobił za pomocą słownika, który przechowa referencję do checkbox-a oraz dane o miesjcu. Przykładowy kawałek kodu (nie wiem dlaczego jestem taki dobry, ale chyba mnie to po prostu zaciekawiło ;) )

        Dictionary<CheckBox, Tuple<int, int>> seats = new Dictionary<CheckBox, Tuple<int, int>>();
        ...
        void setLayout(int rows, int cols)
        {
            for (int i = 0; i < rows; i++)
            {
                for (int j = 0; j < cols; j++)
                {
                    CheckBox cb = new CheckBox();
                    cb.Content = string.Format("{0}:{1}", i, j);
                    cb.Checked += cb_Checked;
                    seats.Add(cb, new Tuple<int,int>( i, j ));
                    wpSeats.Children.Add(cb);
                }
            }
        }

        void cb_Checked(object sender, RoutedEventArgs e)
        {
            CheckBox selected = sender as CheckBox;
            if ( selected != null )
            {
                if ( seats.ContainsKey(selected))
                {
                    string msg = string.Format("Selected seat: {0}:{1}", seats[selected].Item1, seats[selected].Item2);
                    MessageBox.Show(msg);
                }
            }
        }

Z innych opcji mógłbyś też użyć właściwości Tag w checkbox, żeby tam przechować wiersz i kolumnę.

EDIT: Zapomniałem wkleić deklaracji słownika.

0

Super :)

O to mi chodziło w sumie dopiero uczę się programować i nie wiedziałem że można w klasie samemu dopisać poprzez tą linie wywołanie jakiegoś zdarzenia:

newcheckbox.Checked += cb_Checked;

Czy to ma związek z Eventami i Delegatami? Oraz czy z takiego zapisu często korzysta się przy wzorcu MVVM?

Pozdrawiam i dziękuje :)

1

To nie do końca tak... jeżeli zaczynasz przygodę z programowaniem to powinieneś zacząć od podstaw :) Najlepiej od jakiejś dobrej książki, która przedstawi Ci wiedzę w sposób systematyczny.

Tak naprawdę w tej chwili piszesz w tzw. Code behind, czyli w tej samej klasie co Twoje okno, to jest tylko "partial class". Dlatego w zasięgu masz komponenty widoczne na oknie.

newcheckbox.Checked += cb_Checked;

Powyższa linia to dodanie swojego delegata do zdarzenia (event) Checked checkboxa.
Akurat ten zapis nie ma wiele wspólnego z MVVM:) To jest raczej klasyczne podejście bazujące właśnie na eventach i delegatach jak wspominałeś.

Jeżeli miałby to być MVVM, to miałbyś klasę (ViewModel) w którym miałbyś jakieś właściwości - np wszystkie "siedzenia" ale np jako bool'e. Jednak byłby one bindowane do widoku, a nie przypisywane "jawnie". Wtedy użyłbyś bindowania dwukierunkowego (TwoWay binding) i Twój ViewModel byłby aktualizowany automatycznie - czyli w momencie zaznacznie checkbox-a twój bool zmnieniałby się na true i odwrotnie.

To tak w skrócie, ale tak jak pisałem na początku - zacznij od podstaw :)

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