Porównanie i pobranie wartości z listbox.

0

Witam.
Tworzę aplikację, która operuje na bazie w Azure. Potrzebuję pomocy w 2 problemach:

  1. Struktura tabeli wygląda tak: 1. ID 2. Category 3. Type 4. Product (Np 1, Żywność, Słodycze, Czekolada). Chcę żeby w pierwszym listboxie wyświetlały się wszystkie obiekty z kolumny Category (udało mi się to zrobić).
    Kod:
 
 private async void ViewCategory() //wyświetlenie danych z tabeli Category w listboxie
        {

            MobileServiceCollection<string, string> result = null;
            MobileServiceInvalidOperationException exception = null;
            try
            {
                //lista obiektów Category
                result = await todoTable
                    .Select(todoItem => todoItem.Category)
                    .ToCollectionAsync();

            }
            catch (MobileServiceInvalidOperationException ex)
            {
                exception = ex;
            } 

            if (exception != null)
            {
                await new MessageDialog(exception.Message, "Error loading items").ShowAsync();
            }
            else
            {
                CategoryBox.ItemsSource = result.Distinct(); //zwrócenie listy Category
            }
        }

W drugim listboxie powinny wyświetlić się elementy kolumny Type, gdzie wartość kolumny Category powinna taka sama jak ta zaznaczona w pierwszym listboxie (jak ktoś wybierze w 1 listboxie element Żywność, to w 2 powinny mu pojawić się wartości np. słodycze, nabiał itp.) i potem podobnie w 3 kontrolce. Próbowałam takiego kodu, ale nie działa.

 private async void ViewType(string cat) //wyświetlenie danych z tabeli Type w listboxie
        {

           MobileServiceCollection<string, string> result = null;
            MobileServiceInvalidOperationException exception = null;
            try
            {
                //przeszukanie listy obiektów Category i zwrócenie elementów kolumny Type
                result = await todoTable.Where(TodoItem => TodoItem.Category == cat)//porównanie wartości
                    .Select(todoItem => todoItem.Type)
                    .ToCollectionAsync();

            }
            catch (MobileServiceInvalidOperationException ex)
            {
                exception = ex;
            }

            if (exception != null)
            {
                await new MessageDialog(exception.Message, "Error loading items").ShowAsync();
            }
            else
            {
                TypeBox.ItemsSource = result.Distinct(); //zwrócenie listy Type
            }
        }

 private void TypeBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            string _category = CategoryBox.SelectedItem.ToString();//pobranie zaznaczonego elementu z 1 listboxa
            ViewType(_category);
        }
 

Co jest nie tak? Gdzie powinnam wywołać tę funkcję - w kodzie listbox czy w inicjatorze?

  1. W jaki sposób pobrać datę z kontrolki DatePicker i dodać ją do bazy, oraz potem ją z niej pobrać?
0

Problem rozwiązany. Głupi błąd... Metodę ViewType należało wywołać w kontrolce CategoryBox, a nie w TypeBox :)

0

Mam jeszcze pytanie, bo powiązałam ze sobą w ten sposób 3 kontrolki. Jeśli zaznaczę wartość w pierwszym i potem w drugim, to zmieniają się elementy w listbox2. To samo dotyczy listboxa 2 i 3. Lecz jeśli mam zaznaczone wartości we wszystkich 3 i chcę zmienić wartość w pierwszym to wyskakuje mi błąd : "nullreferenceexception was unhandled by user code".

0

Nie wiem na jakiej dokladnie zasadzie masz powiazanie kolekcji oraz czy uzywasz bidingow itp. Lecz pierwsze co mi sie nasuwa do glowy. To wysypuje ci sie w momencie jak zmieniasz kategorie Np listbox1 sprzet komputerowy listbox2 monitory listbox3 jakos model. Wszystkie wartosci wybrales. I teraz zmieniasz kategorie na owoce i parametry ktore masz wubrane ?

I teraz pytanie ustawiaja sie na domyslne ? Jak nie to tutaj masz przyczyne.

0

Chyba właśnie o to chodzi :) Listbox1 przekazuje parametr (string a = Listbox1.SelectedItem.ToString(); ) do listboxa2, a ten do listbox3. Jak "wyczyścić zaznaczenie"?

0

Podam Ci najłatwiejsze rozwiązanie. Każda kolekcja na indeks 0 ma mieć wartość np
(Wybierz kategorie) i teraz robisz zdarzenie w listbox1 podczas zmiany wartości. I jeżeli się wykona ma być w listbox2 i 3 ustawić index na 0 w listbox2 tak samo tylko na listbox3. Jak nie zadziała to musisz pokombinować

0

wystarczyło dodać

 
if (PCombo.SelectedItem != null)
            {
                if (TCombo.SelectedIndex < 0) return;
                type = TCombo.SelectedItem.ToString();
            }

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.