jak posortować DataGrida, gdy ItemsSource jest IList

0

Witajcie, muszę zaimplementować metody sortujące DataGrida. Nie wiem jednak kompletnie jak się do tego zabrać. DataGrid musi się sortować po zmianie wybranego elementu w ComboBoxie. Mam coś takiego:

 private IList<cPrinterInfo> List = new ObservableCollection<cPrinterInfo>();

#region Filtry - Sortowanie
        public enum eSortujWedlug
        {
            NieSortuj,
            StanDrukarki,
            AdresIP,
            RodzajUrzadzenia,
            NazwaHosta,
            Lokalizacja,
            StatusUrzadzenia
        }
        private eSortujWedlug sortujWedlug;
        public eSortujWedlug SortujWedlug
        {
            get
            {
                return sortujWedlug;
            }
            private set
            {
                sortujWedlug = value;
                OnPropertyChanged("SortujWedlug");
            }
        }

        public enum eSortujMalejacoRosnaco
        {
            Malejaco,
            Rosnaco
        }
        private eSortujMalejacoRosnaco sortujMalejacoRosnaco;
        public eSortujMalejacoRosnaco SortujMalejacoRosnaco
        {
            get
            {
                return sortujMalejacoRosnaco;
            }
            private set
            {
                sortujMalejacoRosnaco = value;
                OnPropertyChanged("SortujMalejacoRosnaco");
            }
        }

        private void hComboBoxSortujWedlug_Initialized(object sender, System.EventArgs e)
        {
            (sender as ComboBox).Items.Add("Nie sortuj");
            (sender as ComboBox).Items.Add("Stan drukarki");
            (sender as ComboBox).Items.Add("Adres IP");
            (sender as ComboBox).Items.Add("Rodzaj urządzenia");
            (sender as ComboBox).Items.Add("Nazwa hosta");
            (sender as ComboBox).Items.Add("Lokalizacja");
            (sender as ComboBox).Items.Add("Status urządzenia");
        }
        private void hComboBoxSortujWedlug_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if ((sender as ComboBox).SelectedIndex >= 0)
                SortujWedlug = (eSortujWedlug)(sender as ComboBox).SelectedIndex;
            else
                SortujWedlug = eSortujWedlug.NieSortuj;

        }

        private void hSortujMalejaco_Checked(object sender, RoutedEventArgs e)
        {
            
        }
        private void hSortujRosnąco_Checked(object sender, RoutedEventArgs e)
        {

        }

        private void ListSort(eSortujWedlug SortujWedlug, eSortujMalejacoRosnaco SortujMalejacoRosnaco)
        {
            switch(SortujWedlug)
            {
                case eSortujWedlug.NieSortuj:
                    break;
                case eSortujWedlug.StanDrukarki:
                    ListSort_StanDrukarki(SortujMalejacoRosnaco);
                    break;
                case eSortujWedlug.AdresIP:
                    ListSort_AdresIP(SortujMalejacoRosnaco);
                    break;
                case eSortujWedlug.RodzajUrzadzenia:
                    ListSort_RodzajUrzadzenia(SortujMalejacoRosnaco);
                    break;
                case eSortujWedlug.NazwaHosta:
                    ListSort_NazwaHosta(SortujMalejacoRosnaco);
                    break;
                case eSortujWedlug.Lokalizacja:
                    ListSort_Lokalizacja(SortujMalejacoRosnaco);
                    break;
                case eSortujWedlug.StatusUrzadzenia:
                    ListSort_StatusUrzadzenia(SortujMalejacoRosnaco);
                    break;
            }
        }
        private void ListSort_StanDrukarki(eSortujMalejacoRosnaco SortujMalejacoRosnaco)
        {
            
        }
        private void ListSort_AdresIP(eSortujMalejacoRosnaco SortujMalejacoRosnaco)
        {

        }
        private void ListSort_RodzajUrzadzenia(eSortujMalejacoRosnaco SortujMalejacoRosnaco)
        {

        }
        private void ListSort_NazwaHosta(eSortujMalejacoRosnaco SortujMalejacoRosnaco)
        {

        }
        private void ListSort_Lokalizacja(eSortujMalejacoRosnaco SortujMalejacoRosnaco)
        {

        }
        private void ListSort_StatusUrzadzenia(eSortujMalejacoRosnaco SortujMalejacoRosnaco)
        {

        }

        #endregion

Myślę jak zrobić, aby sortowanie odbywało się w oparciu o jakiś ciąg z wewnątrz obiektu cPrinterInfo. Możecie mnie jakos naprowadzić?

0

Jak wygląda ten obiekt PrinterInfo? Linq i OrderBy(); nie da rady ?

0

OrderBy z przykładów jakie patrze raczej mi się nie przyda, a jest możliwość posortować DataGrid według określonej kolumny (obrazka jaki znajduje się w danym wierszu)? Czy lepiej samemu zaimplementować jakis algorytm sortujący?

0

Czemu uważasz ,że nie da się tego zrobić poprzez OrderBy() ?

0

Ponieważ sortowanie ma następować przy zmianie SelectedItem w comboboxie. Wtedy sortuję według oznaczonych kryteriów. A nie mam jak rozpoznać według jakich.

0

Zrobiłem coś takiego, ale program po rozpoczęciu sortowania zachowuje sie jak w pętli while(true)

 #region Filtry - Sortowanie
        public enum eSortujWedlug
        {
            NieSortuj,
            StanDrukarki,
            AdresIP,
            RodzajUrzadzenia,
            NazwaHosta,
            Lokalizacja,
            StatusUrzadzenia
        }
        private eSortujWedlug sortujWedlug;
        public eSortujWedlug SortujWedlug
        {
            get
            {
                return sortujWedlug;
            }
            private set
            {
                sortujWedlug = value;
                OnPropertyChanged("SortujWedlug");
            }
        }

        public enum eSortujMalejacoRosnaco
        {
            Malejaco,
            Rosnaco
        }
        private eSortujMalejacoRosnaco sortujMalejacoRosnaco;
        
        public eSortujMalejacoRosnaco SortujMalejacoRosnaco
        {
            get
            {
                return sortujMalejacoRosnaco;
            }
            private set
            {
                sortujMalejacoRosnaco = value;
                OnPropertyChanged("SortujMalejacoRosnaco");
            }
        }

        private void hComboBoxSortujWedlug_Initialized(object sender, System.EventArgs e)
        {
            (sender as ComboBox).Items.Add("Nie sortuj");
            (sender as ComboBox).Items.Add("Stan drukarki");
            (sender as ComboBox).Items.Add("Adres IP");
            (sender as ComboBox).Items.Add("Rodzaj urządzenia");
            (sender as ComboBox).Items.Add("Nazwa hosta");
            (sender as ComboBox).Items.Add("Lokalizacja");
            (sender as ComboBox).Items.Add("Status urządzenia");
        }
        private void hComboBoxSortujWedlug_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if ((sender as ComboBox).SelectedIndex >= 0)
                SortujWedlug = (eSortujWedlug)(sender as ComboBox).SelectedIndex;
            else
                SortujWedlug = eSortujWedlug.NieSortuj;
            ListSort(SortujWedlug, SortujMalejacoRosnaco);
        }

        private void hSortujMalejaco_Checked(object sender, RoutedEventArgs e)
        {
            SortujMalejacoRosnaco = eSortujMalejacoRosnaco.Malejaco;
            ListSort(SortujWedlug, SortujMalejacoRosnaco);
        }
        private void hSortujRosnąco_Checked(object sender, RoutedEventArgs e)
        {
            SortujMalejacoRosnaco = eSortujMalejacoRosnaco.Rosnaco;
            ListSort(SortujWedlug, SortujMalejacoRosnaco);
        }

        private void ListSort(eSortujWedlug SortujWedlug, eSortujMalejacoRosnaco SortujMalejacoRosnaco)
        {
            switch(SortujWedlug)
            {
                case eSortujWedlug.NieSortuj:
                    break;
                case eSortujWedlug.StanDrukarki:
                    ListSort_StanDrukarki(SortujMalejacoRosnaco);
                    break;
                case eSortujWedlug.AdresIP:
                    ListSort_AdresIP(SortujMalejacoRosnaco);
                    break;
                case eSortujWedlug.RodzajUrzadzenia:
                    ListSort_RodzajUrzadzenia(SortujMalejacoRosnaco);
                    break;
                case eSortujWedlug.NazwaHosta:
                    ListSort_NazwaHosta(SortujMalejacoRosnaco);
                    break;
                case eSortujWedlug.Lokalizacja:
                    ListSort_Lokalizacja(SortujMalejacoRosnaco);
                    break;
                case eSortujWedlug.StatusUrzadzenia:
                    ListSort_StatusUrzadzenia(SortujMalejacoRosnaco);
                    break;
            }
        }
        private void ListSort_StanDrukarki(eSortujMalejacoRosnaco SortujMalejacoRosnaco)
        {
            for(int n=0; n<List.Count-1; ++n)
            {
                if(Compare(List[n], List[n+1], eSortujWedlug.StanDrukarki, SortujMalejacoRosnaco))
                {
                    Swap(List.ElementAt(n), List.ElementAt(n+1));
                    n = 0;
                }
            }
        }
        private void ListSort_AdresIP(eSortujMalejacoRosnaco SortujMalejacoRosnaco)
        {
            for (int n = 0; n < List.Count - 1; ++n)
            {
                if (Compare(List[n], List[n + 1], eSortujWedlug.AdresIP, SortujMalejacoRosnaco))
                {
                    Swap(List.ElementAt(n), List.ElementAt(n + 1));
                    n = 0;
                }
            }
        }
        private void ListSort_RodzajUrzadzenia(eSortujMalejacoRosnaco SortujMalejacoRosnaco)
        {
            for (int n = 0; n < List.Count - 1; ++n)
            {
                if (Compare(List[n], List[n + 1], eSortujWedlug.RodzajUrzadzenia, SortujMalejacoRosnaco))
                {
                    Swap(List.ElementAt(n), List.ElementAt(n + 1));
                    n = 0;
                }
            }
        }
        private void ListSort_NazwaHosta(eSortujMalejacoRosnaco SortujMalejacoRosnaco)
        {
            for (int n = 0; n < List.Count - 1; ++n)
            {
                if (Compare(List[n], List[n + 1], eSortujWedlug.NazwaHosta, SortujMalejacoRosnaco))
                {
                    Swap(List.ElementAt(n), List.ElementAt(n + 1));
                    n = 0;
                }
            }
        }
        private void ListSort_Lokalizacja(eSortujMalejacoRosnaco SortujMalejacoRosnaco)
        {
            for (int n = 0; n < List.Count - 1; ++n)
            {
                if (Compare(List[n], List[n + 1], eSortujWedlug.Lokalizacja, SortujMalejacoRosnaco))
                {
                    Swap(List.ElementAt(n), List.ElementAt(n + 1));
                    n = 0;
                }
            }
        }
        private void ListSort_StatusUrzadzenia(eSortujMalejacoRosnaco SortujMalejacoRosnaco)
        {
            for (int n = 0; n < List.Count - 1; ++n)
            {
                if (Compare(List[n], List[n + 1], eSortujWedlug.StatusUrzadzenia, SortujMalejacoRosnaco))
                {
                    Swap(List.ElementAt(n), List.ElementAt(n + 1));
                    n = 0;
                }
            }
        }

        private bool Compare(cPrinterInfo p1, cPrinterInfo p2, eSortujWedlug SortujWedlug, eSortujMalejacoRosnaco SortujMalejacoRosnaco)
        {
            string a = "";
            string b = "";
            switch (SortujWedlug)
            {
                case eSortujWedlug.NieSortuj:
                    return false;
                case eSortujWedlug.StanDrukarki:
                    if (p1.ConnectionStatus == cPrinterInfo.eConnectionStatus.Disable)
                        a = "2";
                    else if (p1.ConnectionStatus == cPrinterInfo.eConnectionStatus.InProgress)
                        a = "1";
                    else if (p1.ConnectionStatus == cPrinterInfo.eConnectionStatus.Enable)
                        a = "0";
                    if (p2.ConnectionStatus == cPrinterInfo.eConnectionStatus.Disable)
                        b = "2";
                    else if (p2.ConnectionStatus == cPrinterInfo.eConnectionStatus.InProgress)
                        b = "1";
                    else if (p2.ConnectionStatus == cPrinterInfo.eConnectionStatus.Enable)
                        b = "0";
                    break;
                case eSortujWedlug.AdresIP:
                    a = p1.IPAddress;
                    b = p2.IPAddress;
                    break;
                case eSortujWedlug.RodzajUrzadzenia:
                    a = p1.PrinterName;
                    b = p2.PrinterName;
                    break;
                case eSortujWedlug.NazwaHosta:
                    a = p1.HostName;
                    b = p2.HostName;
                    break;
                case eSortujWedlug.Lokalizacja:
                    a = p1.Comment;
                    b = p2.Comment;
                    break;
                case eSortujWedlug.StatusUrzadzenia:
                    break;
            }
            return (SortujMalejacoRosnaco == eSortujMalejacoRosnaco.Rosnaco) ? ((string.Compare(a, b) >= 0) ? true : false) : ((string.Compare(a, b) >= 0) ? false : true);
        }
        public static void Swap<T>(T lhs, T rhs)
        {
            T temp = lhs;
            lhs = rhs;
            rhs = temp;
        }
        #endregion
0

Mój DataGrid wygląda tak: https://4programmers.net/Pastebin/6390
Element DataGrida jest obiektem: https://4programmers.net/Pastebin/6391
Sprawdziłem DataGridTextColumn i nagłówek kolumny można kliknąć i elementy się sortują. Używam jednak DataGridTemplateColumn i niestety nagłówek kolumny nie reaguje na kliknięcia. Jest możliwe obsłużyć sortowanie? Czy muszę zmieniać Template nagłówka i samemu zaimplementować metody sortowania? Jest możliwość automatycznego sortowania DataGrida tj. Jak już kliknę, że ma by posortowany DataGrid względem tego, czy drukarka jest włączona czy też nie to po np. dodawaniu nowego elementu automatycznie go posortuje. Pomożecie?

0

Znalazłem !

 hListBox.CanUserSortColumns = true;
            hListBox.Columns[0].SortMemberPath = "ConnectionStatus";
            hListBox.Columns[0].CanUserSort = true;
            hListBox.Columns[1].SortMemberPath = "IPAddress";
            hListBox.Columns[1].CanUserSort = true;
            hListBox.Columns[2].SortMemberPath = "PrinterName";
            hListBox.Columns[2].CanUserSort = true;
            hListBox.Columns[3].SortMemberPath = "HostName";
            hListBox.Columns[3].CanUserSort = true;
            hListBox.Columns[4].SortMemberPath = "Comment";
            hListBox.Columns[4].CanUserSort = true;
            hListBox.Columns[9].SortMemberPath = "PrinterStatus";
            hListBox.Columns[9].CanUserSort = true;

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