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

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

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

Код: plaintext
vIEW_PLACEDataGridView.Columns[2].HeaderCell.SortGlyphDirection = System.Windows.Forms.SortOrder.None; 
...
Рейтинг: 0 / 0
03.11.2011, 08:44
    #37509935
Deft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка по нескольким столбцам datagridview
Ну и тут наверное очевидное дополнение:
bindingsource.Sort="Column3 ASC, Column1 DESC, Column5 DESC"
...
Рейтинг: 0 / 0
07.11.2011, 19:18
    #37514989
Kaj09
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка по нескольким столбцам datagridview
Cat2, подскажите а как обращаться к элементам BindingSource? Как вы предлагаете производить сортировку на каждом последующем шаге с учетом предыдущих сортировок?
Как вы считаете, может быть мне просто лучше сортировку осуществлять по средством SQL запроса, запоминаю порядок order by?
...
Рейтинг: 0 / 0
08.11.2011, 07:24
    #37515442
master_sql
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка по нескольким столбцам datagridview
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
11.11.2011, 14:05
    #37522104
IApple
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка по нескольким столбцам datagridview
Нет необходимости отключать сортировку грида при клике на заголовок колонки.
Стандартно использую грид, через биндинсорс привязанный к таблице с данными.
Я использую для пересортировки отдельное окно, на котором кинут 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
11.11.2011, 14:14
    #37522142
AlexM-VB
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка по нескольким столбцам datagridview
Kaj09Cat2, подскажите а как обращаться к элементам BindingSource? Как вы предлагаете производить сортировку на каждом последующем шаге с учетом предыдущих сортировок?
Как вы считаете, может быть мне просто лучше сортировку осуществлять по средством SQL запроса, запоминаю порядок order by?

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


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