powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Сортировка по нескольким столбцам datagridview
10 сообщений из 10, страница 1 из 1
Сортировка по нескольким столбцам datagridview
    #37506024
Kaj09
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!
У меня есть заполненный "заказными" данными компонент datagridview.
Мне хотелось бы получить пошаговую сортировку, например, сначала я сортирую по значениям одного столбца. Потом, с учетом рез-тов первой сортировки, мне нужно упорядочить записи по другому столбцу, потом с учетом предыдущих двух сортировок по третьему и т.д.

т.е. я кликаю правой кнопкой на столбце, выбираю в контекстном меню "по возрастанию"/"по убыванию" (осуществляется программная сортировка). В headerе этого столбца, например, появляется цифра 1 - т.е. сортировка происходит первым на первом по значениям этого столбца. Потом кликаю на другом столбце, и с учетом сортировки по первому столбцу, сортируется по значениям второго выбранного столбца, например по убыванию. и в хэдэре этого столбца появляется цифра 2, ну и значок там треугольничек вниз, указывающий направление сортировки.
Подскажите пожалуйста как реализовать это.
...
Рейтинг: 0 / 0
Сортировка по нескольким столбцам datagridview
    #37506111
master_sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я видел такую штуку под 3,5-й фрэйм кажется, видел что такое можно сделать :)

под второй фрэймворк, при заполнении данных по Fill'у из SqlDataAdapter'a я вообще убирал возможность сортировки для всех столбцов DataGrida, а по двойному щелчку начислял к sql-запросу сортировку по логическим полям columns-ов... в общем то ещё веселье :) зато если делать выгрузку допустим в excel через com, снимая значения с DataGrid, то пойдёт уже с заданной сортировкой) ну и естественно нет разговора о треугольничках, индикатор сортировки нужно выводить отдельно, чтоб юзер не забыл часом, что он там насортировал :) ну и кнопку сброса сортировки опятьже.
...
Рейтинг: 0 / 0
Сортировка по нескольким столбцам datagridview
    #37506187
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
1. Отключить автоматическую сортировку столбцов.
2. Делать сортировку связанного с гридом BindingSource
3. Треугольнички отрисовывать самостоятельно
Примерно так:

Код: plaintext
vIEW_PLACEDataGridView.Columns[2].HeaderCell.SortGlyphDirection = System.Windows.Forms.SortOrder.None; 
...
Рейтинг: 0 / 0
Сортировка по нескольким столбцам datagridview
    #37509935
Фотография Deft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и тут наверное очевидное дополнение:
bindingsource.Sort="Column3 ASC, Column1 DESC, Column5 DESC"
...
Рейтинг: 0 / 0
Сортировка по нескольким столбцам datagridview
    #37514989
Kaj09
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cat2, подскажите а как обращаться к элементам BindingSource? Как вы предлагаете производить сортировку на каждом последующем шаге с учетом предыдущих сортировок?
Как вы считаете, может быть мне просто лучше сортировку осуществлять по средством SQL запроса, запоминаю порядок order by?
...
Рейтинг: 0 / 0
Сортировка по нескольким столбцам datagridview
    #37515442
master_sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kaj09,

прошу прощения что я не Cat2 (хотя очень бы хотелось ^_^ )

в частном порядке я так и делал, массив сортирующих строк пихал в List<string> LB_sort (правда это ListBox но не важно :) )
а при построении, собирал с этого списка в строковую переменную order, ну и order потом подставлял в команду запроса, единственное конечно desc (обратную сортировку) я не предусматривал, но это мне кажется не проблема, проверку на существование в списке повесить и если есть, добавлять desc

собирал так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
        void Sort()
        {
            if (LB_sort.Items.Count > 0)
            {
                order = " order by ";
                for (int i = 0; i < LB_sort.Items.Count - 1; i++)
                    order += LB_sort.Items[i].ToString() + ",";
                //чтоб запятая не пихалась последняя
                order += LB_sort.Items[LB_sort.Items.Count - 1].ToString();
            }
        }

ну это так, для приложения "на коленке" при минимальных знаниях DataGridView, коими я и обладаю.
Хотя даже этими средствами можно выстроить приличный интерфейс (если постараться), правда конечно придётся каждый раз Диспозить и создавать заново DataTable подаваемый на соурс DataGridView, иначе память будет уходить на хранение перезапрошенных таблиц под новую сортировку. Но работает все равно быстро, лично тестил на массиве 12000 на 50.. в общем я утолил свою жажду общения :)
...
Рейтинг: 0 / 0
Сортировка по нескольким столбцам datagridview
    #37522104
IApple
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нет необходимости отключать сортировку грида при клике на заголовок колонки.
Стандартно использую грид, через биндинсорс привязанный к таблице с данными.
Я использую для пересортировки отдельное окно, на котором кинут ListView с именем Fields, у него 2 колонки.
Одна для названия поля данных, как это видно "внутре", вторая - как это названо в заголовке соответствующей колонки грида.
Кроме того к нему прикручен ымажлист с тремя картинками: 0 - для "не сортировать", 1 - "по возрастанию", 2 - "по убыванию".
Ну и собственно кнопка btGO, которая и запустит процесс сортировки.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
    public partial class zSort : Form
    {
        private DataGridView DGV; // грид
        private BindingSource BS;  // сорс
        private ArrayList AL;    // список колонок

        public zSort()
        {
            InitializeComponent();
        }
        public zSort(DataGridView G)
        {
            InitializeComponent();
            SetDGV(G);
        }

        public void SetDGV(DataGridView G)
        {   // привязка "грида"
            if (DGV != G)
            {   // грид не тот, что был перед этим !!!
                this.Fields.Items.Clear();
                this.DGV = G;
                this.BS = (BindingSource)this.DGV.DataSource;
                if (BS.SupportsAdvancedSorting)
                {   // поддерживается сортировка по нескольким колонкам
                    this.AL = new ArrayList();
                    if (BS.IsSorted) // определить колонки, по которым отсортировано на данный момент
                    {
                        for (int i = 0; i < BS.SortDescriptions.Count; i++)
                        {
                            String s = BS.SortDescriptions[i].PropertyDescriptor.Name;
                            DataGridViewColumn X = null;
                            int j = DGV.Columns.Count;
                            while (X == null && j>0)
                            {
                                j--;
                                if (DGV.Columns[j].DataPropertyName == s)
                                {
                                    X = DGV.Columns[j];
                                    this.AL.Add(X);
                                    ListViewItem v = this.Fields.Items.Add(X.HeaderText);
                                    if (BS.SortDescriptions[i].SortDirection == ListSortDirection.Ascending)
                                         v.ImageIndex = 1;
                                    else v.ImageIndex = 2;
                                    v.SubItems.Add(X.DataPropertyName);
                                    v.Name = X.DataPropertyName;
                                }
                            }
                        }
                    }
                    foreach (DataGridViewColumn X in this.DGV.Columns)
                    {   // а теперь добавить все остальные колонки
                        if ((X.Displayed) && (X.SortMode != DataGridViewColumnSortMode.NotSortable)
                            && (Fields.Items[X.DataPropertyName] == null))
                        {
                            ListViewItem v = this.Fields.Items.Add(X.HeaderText);
                            v.Name = X.DataPropertyName;
                            v.ImageIndex = 0;
                            v.SubItems.Add(X.DataPropertyName);
                        }
                    }
                }
            }
        }

        private void Fields_Click(object sender, EventArgs e)
        {
            ListViewItem v = this.Fields.SelectedItems[0];
            int i = v.ImageIndex + 1;
            if (i > 2) i = 0;
            v.ImageIndex = i;
            if (v.ImageIndex == 0)
            {   // подвинуь вниз к не участвующим в сортировке
                int j = v.Index + 1;
                while ((j < this.Fields.Items.Count) && (this.Fields.Items[j].ImageIndex != 0))
                {
                    this.Fields.Items.Remove(v);
                    this.Fields.Items.Insert(j, v);
                    j++;
                }
            }
            else
            {   // подвинуь вверх к участвующим в сортировке
                int j = v.Index - 1;
                while ((j >= 0) && (this.Fields.Items[j].ImageIndex == 0))
                {
                    this.Fields.Items.Remove(v);
                    this.Fields.Items.Insert(j, v);
                    j--;
                }
            }
        }

        private void btGO_Click(object sender, EventArgs e)
        {
            StringBuilder sb = new StringBuilder();
            foreach (ListViewItem v in Fields.Items) 
            {
                if (v.ImageIndex > 0)
                {
                    if (sb.Length > 0) sb.Append(", ");
                    sb.AppendFormat("{0}", v.Name);
                    if (v.ImageIndex == 2) sb.Append(" DESC");
                }
            }
            BS.Sort = sb.ToString(); // собственно сортировка
            this.DialogResult = DialogResult.OK;
        }
    }
...
Рейтинг: 0 / 0
Сортировка по нескольким столбцам datagridview
    #37522142
AlexM-VB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kaj09Cat2, подскажите а как обращаться к элементам BindingSource? Как вы предлагаете производить сортировку на каждом последующем шаге с учетом предыдущих сортировок?
Как вы считаете, может быть мне просто лучше сортировку осуществлять по средством SQL запроса, запоминаю порядок order by?

А, может проще взять нормальный грид (например, XtraGrid от DevExpress), который умеет выполнять многоуровневую сортировку и не парить себе мозг.
...
Рейтинг: 0 / 0
Сортировка по нескольким столбцам datagridview
    #37523496
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
IAppleНет необходимости отключать сортировку грида при клике на заголовок колонки.
Стандартно использую грид, через биндинсорс привязанный к таблице с данными.
Я использую для пересортировки отдельное окно, на котором кинут ListView с именем Fields, у него 2 колонки.
Да, действительно, нет необходимости отключать сортировку.
Это у Вас правильное решение.
Однако можно и по другому, без специальной формы. Отлавливать ColumnHeaderMouseClick и если при этом нажата клавиша Ctrl (например) заносить имя поля столбца в значение BindingSource.Sort. Тут повозится придется с реализацией, но как идея - работоспособно
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Сортировка по нескольким столбцам datagridview
    #38299094
Kaj09
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо IApple. Спустя столько времени очень помогло!
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Сортировка по нескольким столбцам datagridview
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]