Jak przypisać wartość pobieraną z bazy danych do comboboxa ?

0

Mam następujący kod, który nawet działa i zwraca poprawne wartości tylko nie mogę przypisać kolumny z listy do pola comboboxa. Po uruchomieniu pole jest puste ? W poniższy sposób próbuje dodać zwracaną kolumnę przez zapytanie na kilka opcjonalnych sposobów żaden z nich nie funkcjonuje prawidłowo .

                            orderElement.SelectedUri = rdr2.GetString(0);
                            orderElement.OnPropertyChanged(orderElement.SelectedUri);
                            orderElement.FileUris.Add(orderElement.SelectedUri);

a taki kod jest w comboboxie , dodam że jest umieszczony w datagridzie .

<ComboBox ItemsSource="{Binding Path=FileUris}" 
                                      SelectedItem="{Binding Path=SelectedUri, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>

a tak wygląda całe zapytanie do bazy .

 public static IList<OrderElement> PobierzListeZamowien()
        {
            MySqlConnection conn = null;
            MySqlDataReader rdr = null;
            MySqlConnection conn2 = null;
            MySqlDataReader rdr2 = null;
            OrderElement orderElement = null;
            IList<OrderElement> OrderElementsCollection = new ObservableCollection<OrderElement>();

            try
            {
                PolaczenieDB polaczenieDB = new PolaczenieDB();
                conn = polaczenieDB.PolaczenieZBazaDanych();
                string stm = "SELECT zamowienie.IdZamowienia , zamowienie.kontrahent, zamowienie.towar_zamowiony, zamowienie.kwota_zamowienia, zamowienie.data_zamowienia, zamowienie.ilosc FROM zamowienie";
               
                MySqlCommand cmd = new MySqlCommand(stm, conn);
                
                rdr = cmd.ExecuteReader();
                while (rdr.Read())
                {
                    orderElement = new OrderElement();
                    orderElement.IdZamowienia = rdr.GetInt32(0);
                    orderElement.Kontrahent = rdr.GetString(1);
                    orderElement.TowarZamowiony = rdr.GetString(2);
                    orderElement.KwotaZamowienia = rdr.GetDouble(3);
                    orderElement.DataZamowienia = Convert.ToString(rdr.GetDateTime(4));
                    orderElement.Ilosc = rdr.GetInt32(5);

                    try
                    {
                        conn2 = polaczenieDB.PolaczenieZBazaDanych();
                        string stm2 = "SELECT zamowieniePlik.nazwaPliku, zamowieniePlik.idZamowienia FROM zamowieniePlik WHERE                   zamowieniePlik.IdZamowienia='" + orderElement.IdZamowienia + "';";
                        MySqlCommand cmd2 = new MySqlCommand(stm2, conn2);
                        rdr2 = cmd2.ExecuteReader();

                        while (rdr2.Read())
                        {
                            // orderElement = new OrderElement();
                            orderElement.SelectedUri = rdr2.GetString(0);
                            orderElement.OnPropertyChanged(orderElement.SelectedUri);
                            orderElement.FileUris.Add(orderElement.SelectedUri);

                        }

                    }
                    catch (MySqlException ex)
                    {
                    }
                    OrderElementsCollection.Add(new OrderElement(orderElement));
                }
            }
            catch (MySqlException ex)
            {
            }
           
            conn.Close();
            return OrderElementsCollection;
        }

0

Pokaż jak wygląda kłasa order element. Przede wszystkim twój widok elementów w combobox powiązany jest z listą FileUris. SelectedUri wskazuje na element z listy FileUris. Jeżeli ustawisz SelectedUri na obiekt który nie istnieje w tej liście to będzie to wartość null, ponieważ nie możesz wybrać z listy czegoś czego w tej liście nie ma. Najprościej utworzyć metodę która na podstawie argumentów np nazwy pliku zwraca Ci element z listy i wtedy ustaw ten wyszukany element jako SelectedUri

Idąc tym tokiem dalej, nie przypisuj wartości do comboboxa tylko dodawaj, wyszukuj lub usuwaj je z listy w ViewModelu.

Zapomij, że ten combobox istnieje i zajmij się wyciąganiem danych z ViewModelu

1
class MainWindowViewModel : INotifyPropertyChanged
    {
        #region PropertyChanged
        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged(string PropertyName)
        {
            this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(PropertyName));
        }
        #endregion
        public MainWindowViewModel()
        {

        }

        /// <summary>
        /// Kolekcja wszystkich dostępnych zamówień
        /// </summary>
        public IList<Order> OrderElementsCollection { get; private set; } = new ObservableCollection<Order>();
        /// <summary>
        /// Ustawia właściwość <see cref="SelectedOrder"/> na wartość elementu z kolekcji <see cref="OrderElementsCollection"/> o podanym <see cref="Order.ID"/>. Jeżeli element nie zostanie znaleziony zwraca wyjątek
        /// </summary>
        /// <param name="ID">Identyfikator zamówienia</param>
        /// <exception cref="Exception"/>
        public void Select(int ID)
        {
            // Wyszukanie w OrderElementsCollection
            Order order = Find(ID);
            if (order == null)
                throw new Exception("Nie znaleziono elementu o podanych kryteriach");
            SelectedOrder = order;
        }
        /// <summary>
        /// Wyszukuje w kolekcji <see cref="OrderElementsCollection"/> elementu <see cref="Order"/> o podanym <see cref="Order.ID"/>. Jeżeli nie znaleziono elementów zwaraca NULL
        /// </summary>
        /// <param name="ID"></param>
        /// <returns>Zwraca znaleziony <see cref="Order"/> lub NULL, jeżeli nie znaleziono</returns>
        public Order Find(int ID)
        {
            return OrderElementsCollection.FirstOrDefault(x => x.ID == ID);
        }

        private Order selectedOrder;
        public Order SelectedOrder
        {
            get
            {
                return selectedOrder;
            }
            internal set
            {
                selectedOrder = value;
                OnPropertyChanged("SelectedOrder");
            }
        }
    }
  1. Zobacz co się stanie jak wywołasz metodę MainWindowViewModel.Select
  2. Nadal nie przeczytałeś, do czego służy PropertyChanged i usilnie używasz go bez sensu. I to kilka razy na jedną zmianę właściwości
  3. orderElement.FileUris.Add(orderElement.SelectedUri); - Tutaj ewidentnie dodajesz do Comboboxa zaznaczony element. Ale zaraz - Skoro ten element jest zaznaczony to istnieje już w FileUris. Chyba, że Twój SelectedUri == null wtedy patrz punkt pierwszy.

Chyba te 3 punkty starczą abyś się domyślił na czym to polega :) Nie jestem zgryźliwy, po prostu tak mnie 4programmers wychowało abym sam dochodził do rozwiązania małymi krokami i dzięki temu dowiesz się tysiąca innych rzeczy które przydadzą Ci się w przyszłości ;P

0

Zrobiłem tak jak napisałeś, zapytanie do bazy działa i zwraca poprawne wartości , nawet datacontext zrwaca poprawne wartości po przeiterowaniu a w widoku pusto. Pusty wiersz, według mnie coś jest nie tak ustawione w comboboxie w widoku.

 hViewModel.OrderElementsCollection= ListaZamowien2;
                
            foreach(var a in hViewModel.OrderElementsCollection)
            {
                Console.WriteLine(a.IdZamowienia + "    XXXXXXXXXXXXXXXXXXXXXXXXXXXXX    " +a.SelectedUri );
            }
// Wynik odzwierciedla dokładnie to co jest w bazie 
//  1    XXXXXXXXXXXXXXXXXXXXXXXXXXXXX    Mojplik1
//  1    XXXXXXXXXXXXXXXXXXXXXXXXXXXXX    MojPlIk2
//  2    XXXXXXXXXXXXXXXXXXXXXXXXXXXXX    MojPlik3
0

Podałem Ci błędy. Popraw je, wrzuć tutaj na nowo poprawiony kod i będziemy działać dalej. Nadal nie napisałeś, jak wygląda twoja klasa order

0

tak wygląda zapytanie do bazy


 public static IList<OrderElement> PobierzListeZamowien()
        {
            MySqlConnection conn = null;
            MySqlDataReader rdr = null;
            MySqlConnection conn2 = null;
            MySqlDataReader rdr2 = null;
            OrderElement orderElement2 = null;
            Zamowienie zamowienie = new Zamowienie();
            MainViewModel1 main = new MainViewModel1();
            IList<OrderElement> OrderElementsCollection = new ObservableCollection<OrderElement>();
           
            try
            {
                PolaczenieDB polaczenieDB = new PolaczenieDB();
                conn = polaczenieDB.PolaczenieZBazaDanych();
                string stm = "SELECT zamowienie.IdZamowienia , zamowienie.kontrahent, zamowienie.towar_zamowiony, zamowienie.kwota_zamowienia, zamowienie.data_zamowienia, zamowienie.ilosc FROM zamowienie";
               
                MySqlCommand cmd = new MySqlCommand(stm, conn);
                
                rdr = cmd.ExecuteReader();
                while (rdr.Read())
                {
                    zamowienie = new Zamowienie();
                    zamowienie.IdZamowienia = rdr.GetInt32(0);
                    zamowienie.Kontrahent = rdr.GetString(1);
                    zamowienie.TowarZamowiony = rdr.GetString(2);
                    zamowienie.KwotaZamowienia = rdr.GetDouble(3);
                    zamowienie.DataZamowienia = Convert.ToString(rdr.GetDateTime(4));
                    zamowienie.Ilosc = rdr.GetInt32(5);
                    try
                    {
                        conn2 = polaczenieDB.PolaczenieZBazaDanych();
                        string stm2 = "SELECT zamowieniePlik.nazwaPliku, zamowieniePlik.idZamowienia FROM zamowieniePlik WHERE zamowieniePlik.IdZamowienia='" + zamowienie.IdZamowienia + "';";
                        MySqlCommand cmd2 = new MySqlCommand(stm2, conn2);
                        rdr2 = cmd2.ExecuteReader();

                        while (rdr2.Read())
                        {
                           
                            orderElement2 = new OrderElement(zamowienie);
                            orderElement2.SelectedUri = rdr2.GetString("nazwaPliku");
                            orderElement2.FileUris.Add(orderElement2.SelectedUri);
                            main.SelectedOrder = zamowienie;
                            OrderElementsCollection.Add(orderElement2);
                        }
                       
                    }
                    catch (MySqlException ex)
                    {
                    }
                   
                }
            } 
            catch (MySqlException ex)
            {
            }
            conn.Close();
            return OrderElementsCollection;
        }

tak wygląda MainViewModel , przy czym zamieniłem w instancji listy OrderElementsCollection z Zamowienie na OrderElement , chciałem zobaczyć czy datacontext będzie miał w sobie zalaczony plik . Aczkolwiek ani ta wersja ani poprzednia nie działa . Otrzymuje pusty wiersz w widoku ?

 public  class MainViewModel1 : INotifyPropertyChanged
    {

        #region PropertyChanged
        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged(string PropertyName)
        {
            this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(PropertyName));
        }
        #endregion

        public MainViewModel1()
        {

        }

        /// <summary>
        /// Kolekcja wszystkich dostępnych załączników
        /// </summary>
        public IList<string> UriCollection { get; private set; } = new ObservableCollection<string>();
        /// <summary>
        /// Kolekcja wszystkich dostępnych zamówień
        /// </summary>
        public IList<OrderElement> OrderElementsCollection { get;  set; } = new ObservableCollection<OrderElement>();



        public void Select(int idzamowienia)
        {
            // Wyszukanie w OrderElementsCollection
            Zamowienie zamowienie = Find(idzamowienia);
            if (zamowienie == null)
                throw new Exception("Nie znaleziono elementu o podanych kryteriach");
            SelectedOrder = zamowienie;
        }
        private Zamowienie selectedOrder;
        public Zamowienie SelectedOrder
        {
            get
            {
                return selectedOrder;
            }
            set
            {
                selectedOrder = value;
                OnPropertyChanged("SelectedOrder");
            }
        }

        public Zamowienie Find(int ID)
        {
            return OrderElementsCollection.FirstOrDefault(x => x.IdZamowienia == ID);
        }
}}
0

Przeanalizuj na spokojnie metodę find oraz select. Popraw je i wklej poprawiony kod.

Przeanalizuj SelectedOrder i przemysl, na jaki element powinien wskazywać

W poprzednim poście chciałeś różne załączniki dla każdego zamówienia. To po co trzymasz "wszystkie dostępne załączniki"? Po co one są?

Nadal nie wkleiles mi wszystkich Twoich klas z których korzystasz. Proszę trzeci raz :)

Nie prosiłem o sposób jak pobierasz dane z bazy danych. Nie rób wykończeniówki jak nie stoją fundamenty

0

klasa OrderEllement

 public class OrderElement : Zamowienie, INotifyPropertyChanged
    
    {
        public OrderElement():base()
        {
            
        }
        public OrderElement(Zamowienie zamowienie) : base(zamowienie.IdZamowienia, zamowienie.TowarZamowiony , zamowienie.Kontrahent , zamowienie.DataZamowienia, zamowienie.Ilosc,  zamowienie.KwotaZamowienia)
        {
            
        }
        private string selectedUri;
        /// <summary>
        /// Obiekt z Comboboxa wybrany dla każdego elementu
        /// </summary>
        public string SelectedUri
        {
            get
            {
                return selectedUri;
            }
            set
            {
                selectedUri = value;
                OnPropertyChanged("SelectedUri");
            }
        }

        /// <summary>
        /// Lista plików dostępnych dla konkretnego elementu
        /// </summary>
        public IList<string> FileUris { get;  set; } = new ObservableCollection<string>();
    }

}

klasa Zamowienie dodam tylko ze klasę Order zamieniłem na Zamowienie właśnie

 public class Zamowienie : INotifyPropertyChanged

    {
        public Zamowienie()
        {
        }
        public Zamowienie(int idZamowienia , string towarZamowiony, string kontrahent, string dataZamowienia ,int ilosc, double  kwotaZamowienia  )
        {
            IdZamowienia = idZamowienia;
            TowarZamowiony = towarZamowiony;
            Kontrahent = kontrahent;
            DataZamowienia = dataZamowienia;
            Ilosc = ilosc;
            KwotaZamowienia = kwotaZamowienia;
        }

     
        
        public int IdZamowienia { get; set; }
        public string TowarZamowiony { get; set; }
        public string Kontrahent { get; set; }
        public string DataZamowienia { get; set; }
        public double KwotaZamowienia { get; set; }
        public int Ilosc { get; set; }
     
        #region PropertyChanged
        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged(string PropertyName)
        {
            this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(PropertyName));
        }
        #endregion
}
}
0

czy chodzi ci o to Grzegorzu że metoda nie powinna być typu void tylko zwracać wartość ?
Select(int idzamowienia)

0

czy by o to ci chodziło

  public Zamowienie Select(int idzamowienia)
        {
            // Wyszukanie w OrderElementsCollection
            Zamowienie zamowienie = Find(idzamowienia);
            if (zamowienie == null)
                throw new Exception("Nie znaleziono elementu o podanych kryteriach");
            SelectedOrder = zamowienie;
            return SelectedOrder;
        }

i druga metoda, ale chyba nie o to

 public Zamowienie Find(int ID)
        {
            return OrderElementsCollection.First(x => x.IdZamowienia == ID);
        }
0

Dobrze. Znalazłeś te dwie motody w których masz błąd. Przeczytaj opisy które Ci zrobiłem do tych metod wcześniej, a potem przeanalizuj je z obecnym kodem. Tak będzie dla Ciebie najprościej. Jeżeli uda ci się znaleźć błąd wklej go tutaj i opisz co było źle oraz wklej poprawiony kod. Rozwiązanie podałem ci na tacy. Teraz twoja kolej na trochę pracy.

0
Grzegorz Świdwa napisał(a):

Dobrze. Znalazłeś te dwie motody w których masz błąd. Przeczytaj opisy które Ci zrobiłem do tych metod wcześniej, a potem przeanalizuj je z obecnym kodem. Tak będzie dla Ciebie najprościej. Jeżeli uda ci się znaleźć błąd wklej go tutaj i opisz co było źle oraz wklej poprawiony kod. Rozwiązanie podałem ci na tacy. Teraz twoja kolej na trochę pracy.

Poproszę o jakieś dodatkowe wskazówki . Z mojego punktu widzenia ty próbujesz w kodzie zabezpieczyć się przed załączeniem załącznika do wiersza który może być nullem .
A ja próbuję zrobić kod który będzie wyciągać wszystkie zamówienia wraz z możliwymi załącznikami . Tak, dobrze rozumuję ?

0

Nie. Powiedz mi co powinna robić metoda. Załóżmy, że masz tylko te dwie metody i kolekcję zamówień. Napisz mi tutaj, co dokładnie robią te metody, na czym wykonują operacje i co zwracają

0
Grzegorz Świdwa napisał(a):

Nie. Powiedz mi co powinna robić metoda. Załóżmy, że masz tylko te dwie metody i kolekcję zamówień. Napisz mi tutaj, co dokładnie robią te metody, na czym wykonują operacje i co zwracają

select() zwraca obiekt typu Zamowienie , a find() zwraca liste Zamowien z pierwszym elementem jaki znajdzie , czyli tylko z jednym elementem

0

Czy metoda select będzie coś zwracać czy nie to nieważne. Ważne jest to co ona dokładnie robi. Powiedz mi co robi każda linijka w tej metodzie

0

Nie mam pojęcia o co ci chodzi . Może tak to ma wyglądać.

SelectOrder = new OrderElement(zamowienie);
0

Czy Ty w ogóle umiesz jakieś podstawy? Czy bierzesz się za mysql i wpf nie mając pojęcia o c#?

 public IList<OrderElement> OrderElementsCollection { get;  set; } = new ObservableCollection<OrderElement>();

        public void Select(int idzamowienia)
        {
            // Wyszukanie w OrderElementsCollection
            Zamowienie zamowienie = Find(idzamowienia);
            if (zamowienie == null)
                throw new Exception("Nie znaleziono elementu o podanych kryteriach");
            SelectedOrder = zamowienie;
        }
        private Zamowienie selectedOrder;
        public Zamowienie SelectedOrder
        {
            get
            {
                return selectedOrder;
            }
            set
            {
                selectedOrder = value;
                OnPropertyChanged("SelectedOrder");
            }
        }

        public Zamowienie Find(int ID)
        {
            return OrderElementsCollection.FirstOrDefault(x => x.IdZamowienia == ID);
        }

Powiedz co robi każde polecenie w linii, jeżeli nie będzie CI się chciało do tego dojść to nie ma o czym nawet pisać. naprowadzam CIe na odpowiedź a Ty masz to gdzieś i wymyślasz z palca durne rozwiązania. Poświęć trochę czasu i zrób o co proszę

0

public void Select(int idzamowienia) - publiczna metoda z parmatrem typu int .
Zamowienie zamowienie = Find(idzamowienia); - przypisuje do deklaracji zmiennej zamówienie typu Zamowienie wynik przeszukania listy OrderElementsCollection.FirstOrDefault(x => x.IdZamowienia == ID) i jeśli id się zgadza to zwraca wartość , wprzeciwnym wypadku null.
if (zamowienie == null) sprawdzamy czy zamówienie jest nullem jeśli tak to wyrzucamy wyjątek throw new Exception("Nie znaleziono elementu o podanych kryteriach");.
SelectedOrder = zamowienie; przypisanie zmiennej obiektowej typu zamówienie do metody publicznej SelectedOrder
private Zamowienie selectedOrder; deklaracja prywatnej zmiennej

utworzenie getterow i setterow i publicznej metody SelectedOrder za pomocą które pobiera się i ustawia prywatna zmienną

 public Zamowienie SelectedOrder
        {
            get
            {
                return selectedOrder;   zwracam selectOrder
            }
            set
            {
                selectedOrder = value;     przypisuje wartość do selectedOrder 
                OnPropertyChanged("SelectedOrder");     wywoluje metode znazwa zmiennej
            }

publiczna metoda z parametrem typu int , przeszukuje liste po id

 public Zamowienie Find(int ID)   
        {
            return OrderElementsCollection.FirstOrDefault(x => x.IdZamowienia == ID);   
        }
1

Okej, dobra robota!
Kilka informacji na początek , potem polecimy dalej:

OnPropertyChanged("SelectedOrder");

OnPropertyChanged Informuje wszystkie kontrolki które bindują do właściwości "nazwa_zmiennej", że wartość zmieniła się i Twój widok musi zostać odświeżony.

  1. Teraz kolejny tok myślenia. Pokaże Ci przykład błędu nieco bardziej wyrazisty, a Ty postaraj się zauważyć go w swoim ViewModelu
    screenshot-20200304194039.png
namespace Aplikacja
{
    /// <summary>
    /// Klasa zawierająca właściwość kolory ubrań
    /// </summary>
    class ClothColours : INotifyPropertyChanged
    {
        #region PropertyChanged
        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged(string PropertyName)
        {
            this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(PropertyName));
        }
        #endregion
        /// <summary>
        /// inicjuje nowe wystąpienie obiektu
        /// </summary>
        public ClothColours()
        {
            
        }

        /// <summary>
        /// Lista dostępnych kolorów dla danej osoby
        /// </summary>
        public IList<string> Colours { get; private set; } = new ObservableCollection<string>();

        private string selectedColour;
        /// <summary>
        /// Wybrany kolor dla konkretnej osoby z listy <see cref="Colours"/>. Można bindować do SelectedItem w ComboBox z ItemsSource = Colours
        /// </summary>
        public string SelectedColour
        {
            get
            {
                return selectedColour;
            }
            set
            {
                selectedColour = value;
                OnPropertyChanged("SelectedColour");
            }
        }
    }
    /// <summary>
    /// Klasa z danymi osoby. Dziedziczy właściwości po <see cref="ClothColours"/>
    /// </summary>
    class Person : ClothColours, INotifyPropertyChanged
    {
        #region PropertyChanged
        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged(string PropertyName)
        {
            this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(PropertyName));
        }
        #endregion
        /// <summary>
        /// Inicjuje nowe wystąpienie obiektu
        /// </summary>
        /// <param name="ID">ID</param>
        /// <param name="Name">Nazwa</param>
        public Person(int ID, string Name)
        {
            this.ID = ID;
            this.Name = Name;
        }
        /// <summary>
        /// ID
        /// </summary>
        public int ID { get; private set; }
        /// <summary>
        /// Nazwa
        /// </summary>
        public string Name { get; private set; }
        
    }
    /// <summary>
    /// Twój ViewModel
    /// </summary>
    class MainWindowViewModel : INotifyPropertyChanged
    {
        #region PropertyChanged
        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged(string PropertyName)
        {
            this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(PropertyName));
        }
        #endregion
        public MainWindowViewModel()
        {

        }

        /// <summary>
        /// Kolekcja wszystkich dostępnych osób
        /// </summary>
        public IList<Person> People { get; private set; } = new ObservableCollection<Person>();
        /// <summary>
        /// Ustawia właściwość <see cref="SelectedPerson"/> na wartość elementu z kolekcji <see cref="OrderElementsCollection"/> o podanym <see cref="Order.ID"/>. Jeżeli element nie zostanie znaleziony zwraca wyjątek
        /// </summary>
        /// <param name="ID">Identyfikator osoby istniejącej w kolekcji <see cref="People"/></param>
        /// <exception cref="Exception"/>
        public void SelectPerson(int ID)
        {
            // Wyszukanie w OrderElementsCollection
            ClothColours clothColour= FindPerson(ID);
            if (clothColour == null)
                throw new Exception("Nie znaleziono elementu o podanych kryteriach");
            SelectedPerson = clothColour;
        }
        /// <summary>
        /// Wyszukuje w kolekcji <see cref="People"/> elementu <see cref="Person"/> o podanym <see cref="Person.ID"/>. Jeżeli nie znaleziono elementów zwaraca NULL
        /// </summary>
        /// <param name="ID">Identyfikator osoby</param>
        /// <returns>Zwraca znaleziony obiekt <see cref="Person"/> w kolekcji <see cref="People"/> lub NULL, jeżeli nie znaleziono</returns>
        public ClothColours FindPerson(int ID)
        {
            return People.FirstOrDefault(x => x.ID == ID);
        }

        private ClothColours selectedPerson;
        /// <summary>
        /// Wybrana osoba z kolekcji <see cref="People"/>. Do tej właściwości można bindować DataGrida aby kontrolować w dwie strony wybrany element w DataGridzie. (Spójrz jakiego typu jest ta zmienna)
        /// </summary>
        public ClothColours SelectedPerson
        {
            get
            {
                return selectedPerson;
            }
            internal set
            {
                selectedPerson = value;
                OnPropertyChanged("SelectedPerson");
            }
        }
    }
    
}

Przyjrzyj się uważnie metodzie
public ClothColours FindPerson(int ID)
oraz
public void SelectPerson(int ID)
Mając na uwadze
public IList<Person> People { get; private set; } = new ObservableCollection<Person>();
co jest nie tak z tymi metodami?

0

Wydaję mi się że jest odwrotnie zrobione dziedziczenie , ClothColours powinien dziedziczyć po Person ?

0

Bardzo dobrze! Znalazłeś błąd!
Teraz zobacz co robisz w metodzie

IList<OrderElement> OrderElementsCollection

To jest kolekcja przechowująca typy OrderElement. OrderElement dziedziczy po "Zamówienie". Tak więc jest to zbiór właściwości tych obu klas
screenshot-20200305083628.png

Gdy zrobisz:

Zamowienie zamowienie = new OrderElement(...);

nie dostaniesz błędu kompilacji, ponieważ OrderElement dziedziczy po Zamowienie, lecz stracisz dostęp do właściwości OrderElement
screenshot-20200305083813.png

Popraw teraz metodę Find i Select aby operowały na właściwych typach i wklej tylko te dwie poprawione metody. Jak to zrobisz będziemy mieli fundamenty aby Twój ComboBox zaczął działać :)

1

tak chyba dobrze poprawiłem


 public void Select(int idzamowienia)
        {
            // Wyszukanie w OrderElementsCollection
            OrderElement orderElement  = Find(idzamowienia);
            if (orderElement == null)
            {
                throw new Exception("Nie znaleziono elementu o podanych kryteriach");
            }
               SelectedOrder = orderElement;
         }
        public OrderElement Find(int ID)
        {
            return OrderElementsCollection.First(x => x.IdZamowienia == ID);
        }
0

Pierwsze co teraz musisz zrobić to napisać metodę wewnątrz OrderElement

public void Select(string Uri);
  • Tą metodę wywołasz, aby w Comboboxie zaznaczył się element który podasz.

  • Jak już to będzie gotowe usuń z **MainWindowViewModel **właściwość UriCollection, bo ona jest Ci do niczego niepotrzebna.

  • Następnie zobacz w jaki sposób się dodaje element do OrderCollection i wypełnia **FileUris ** dla każdego elementu OrderElement.
    Wewnątrz MainWindowViewModel tworzymy metodę dodającą element do listy OrderCollection.

public void AddOrderElement(OrderElement ElementToAdd)
{
     if(ElementToAdd == null)
          throw new Exception("ElementToAdd = null");
     //Nie musisz robić
     //OrderCollection.Add(new OrderElement(ElementToAdd))
     //ponieważ  ElementToAdd już jest typem OrderCollection
     // Robimy więc tak:
     OrderCollection.Add(ElementToAdd);
}

Wewnątrz MainWindowViewModel tworzymy metodę dodającą ścieżkę załącznika do **FileUris **jednego z elementu OrderCollection

public void AddUriToOrderElement(int OrderElementID, string UriToAdd)
{
     //Tutaj wyszukujesz za pomocą swojej poprawionej metody **Find**() OrderElement o podanym ID, a następnie jeżeli znalazło element
     // OrderElement FoundElementByID = ?
     FoundElementByID.FileUris.Add(UriToAdd);
}

Jak zrobisz to wszystko co napisałem pokaż kod, a ja Ci pokażę jak tego użyć w twojej metodzie do pobierania danych

ps. zbliżamy się do końca :)

0
Grzegorz Świdwa napisał(a):

Pierwsze co teraz musisz zrobić to napisać metodę wewnątrz OrderElement

public void Select(string Uri);
  • Tą metodę wywołasz, aby w Comboboxie zaznaczył się element który podasz.

  • Jak już to będzie gotowe usuń z **MainWindowViewModel **właściwość UriCollection, bo ona jest Ci do niczego niepotrzebna.

  • Następnie zobacz w jaki sposób się dodaje element do OrderCollection i wypełnia **FileUris ** dla każdego elementu OrderElement.
    Wewnątrz MainWindowViewModel tworzymy metodę dodającą element do listy OrderCollection.

public void AddOrderElement(OrderElement ElementToAdd)
{
     if(ElementToAdd == null)
          throw new Exception("ElementToAdd = null");
     //Nie musisz robić
     //OrderCollection.Add(new OrderElement(ElementToAdd))
     //ponieważ  ElementToAdd już jest typem OrderCollection
     // Robimy więc tak:
     OrderCollection.Add(ElementToAdd);
}

Wewnątrz MainWindowViewModel tworzymy metodę dodającą ścieżkę załącznika do **FileUris **jednego z elementu OrderCollection

public void AddUriToOrderElement(int OrderElementID, string UriToAdd)
{
     //Tutaj wyszukujesz za pomocą swojej poprawionej metody **Find**() OrderElement o podanym ID, a następnie jeżeli znalazło element
     // OrderElement FoundElementByID = ?
     FoundElementByID.FileUris.Add(UriToAdd);
}

Jak zrobisz to wszystko co napisałem pokaż kod, a ja Ci pokażę jak tego użyć w twojej metodzie do pobierania danych

ps. zbliżamy się do końca :)

ok , mam już

0
jan kowal napisał(a):
Grzegorz Świdwa napisał(a):

Pierwsze co teraz musisz zrobić to napisać metodę wewnątrz OrderElement

public void Select(string Uri);
  • Tą metodę wywołasz, aby w Comboboxie zaznaczył się element który podasz.

  • Jak już to będzie gotowe usuń z **MainWindowViewModel **właściwość UriCollection, bo ona jest Ci do niczego niepotrzebna.

  • Następnie zobacz w jaki sposób się dodaje element do OrderCollection i wypełnia **FileUris ** dla każdego elementu OrderElement.
    Wewnątrz MainWindowViewModel tworzymy metodę dodającą element do listy OrderCollection.

public void AddOrderElement(OrderElement ElementToAdd)
{
     if(ElementToAdd == null)
          throw new Exception("ElementToAdd = null");
     //Nie musisz robić
     //OrderCollection.Add(new OrderElement(ElementToAdd))
     //ponieważ  ElementToAdd już jest typem OrderCollection
     // Robimy więc tak:
     OrderCollection.Add(ElementToAdd);
}

Wewnątrz MainWindowViewModel tworzymy metodę dodającą ścieżkę załącznika do **FileUris **jednego z elementu OrderCollection

public void AddUriToOrderElement(int OrderElementID, string UriToAdd)
{
     //Tutaj wyszukujesz za pomocą swojej poprawionej metody **Find**() OrderElement o podanym ID, a następnie jeżeli znalazło element
     // OrderElement FoundElementByID = ?
     FoundElementByID.FileUris.Add(UriToAdd);
}

Jak zrobisz to wszystko co napisałem pokaż kod, a ja Ci pokażę jak tego użyć w twojej metodzie do pobierania danych

ps. zbliżamy się do końca :)

ok , mam już. Mam nadzieje że nie wybuchnie

0

Kurde człowieku nie kopiuj wszystkiego do kodu co Ci napiszę. Przeczytaj ze zrozumieniem.

Zrób metodę wewnatrz OrderElement która ustawi Ci SelectedUri na taki jaki podasz w argumencie. SelectedUri musi być ciągiem który wystepuje w kolekcji FileUris. Jak zrobisz ta metodę o nazwie SelectUri wstaw całą klasę OrderElement do sprawdzenia.

Kiedy piszę "napisz metodę" to oznacza "napisz i wklej tutaj do sprawdzenia"

0

  public class OrderElement : Zamowienie, INotifyPropertyChanged
    
    {
        public OrderElement():base()
        {
            
        }
        public OrderElement(Zamowienie zamowienie) : base(zamowienie.IdZamowienia, zamowienie.TowarZamowiony , zamowienie.Kontrahent , zamowienie.DataZamowienia, zamowienie.Ilosc,  zamowienie.KwotaZamowienia)
        {
            
        }
        private string selectedUri;
        /// <summary>
        /// Obiekt z Comboboxa wybrany dla każdego elementu
        /// </summary>
        public string SelectedUri
        {
            get
            {
                return selectedUri;
            }
            set
            {
                selectedUri = value;
                OnPropertyChanged("SelectedUri");
            }
        }
        public void SelectUri(string Uri)
        {
            SelectedUri = Uri;
        }


        /// <summary>
        /// Lista plików dostępnych dla konkretnego elementu
        /// </summary>
        public IList<string> FileUris { get;  set; } = new ObservableCollection<string>();
       // public IList<string> UriCollection { get;  set; } = new ObservableCollection<string>();
       
    }
0

Źle :( Czym różni się "selectedUri" od "SelectedUri" ?

Co dokładnie dzieje się gdy zmieniasz wartość w selectedUri, a co się dzieje, gdy zmieniasz w SelectedUri?

0

poprawiłem już. Trzeba ustawiać przez metody publiczne

0

wyjaśnij mi , bo nie jestem pewien . Wedlug mnie setery i getery pozwalają ustawić zmienna która jest prywatna z innej klasy inaczej nie da rady

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