Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 14.01.2023
Сообщений: 45

Сортировка DataGridView

22.11.2023, 13:16. Показов 806. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет
Нужна помощь в правильной реализации сортировки строк.

Есть словарь dictionary, в первом параметре используется ключ (некий int-овый ID), во втором параметре структура, которая будет хранить некоторые значение (название, тип, количество и т.д)

Далее, есть таблица datagridview, в которую нужно выводить значения из структуры (которая находится в словаре)

Пример таблицы:
-------------------- Столбцы ---------------------
Название | номер изделия | тип | количество
Хлеб___________30_______белый_____20____ Строка с id 0
Хлеб___________15_______серый_____50____ Строка с id 1
Хлеб___________25_______черный____100___ Строка с id 2
Батон__________88_______белый______44___ Строка с id 3
Батон__________65_______белый______13___ Строка с id 4
Батон__________92_______белый______25___ Строка с id 5

Под номером изделия и есть тот самый int-овый ID (который в словаре в качестве ключа)
Приходят данный, если такого ID нет в словаре, то добавляем в словарь, а затем в таблицу, когда первая строка добавляется в таблицу, она получается автоматически (насколько я понимаю) свой id строки (0), вторая строка (1) и т.д (этот получивший id я сохраняю в словарь, просто беру общее количество строк - 1)
Когда приходит ID который уже есть в словаре (а значит он есть и в таблице) но с какими то изменёнными данными (например количество хлеба/батона) то я по номеру строки (который я сохранил в словарь) обращаюсь к нужному rows[id] и обновляю данные в соседних столбцах.

И всё бы хорошо, но мне понадобилось сортировать таблицу по номеру изделия и по названию.
Начал по номеру изделия используя функцию dataGridView1.Sort(dataGridView1.Columns[1], ListSortDirection.Ascending);
Вроде как данные от сортировались, но id строк не переместились, т.е я думал будет примерно так:

Хлеб___________15_______серый_______50__ _____Строка с id 1
Хлеб___________25_______черный_______100 _____Строка с id 2
Хлеб___________30_______белый_______20__ _____Строка с id 0

И я тогда смогу как обычно обращаться по id строки которая у меня уже есть (с конкретным key ID в словаре) изменять нужные мне данные, но на деле оказалось не так как думал:

Хлеб___________15_______серый_______50__ _____Строка с id 0
Хлеб___________25_______черный_______100 _____Строка с id 1
Хлеб___________30_______белый_______20__ _____Строка с id 2

сортировка произошла, а id строки так и остались в порядке возрастания и при изменении данных, менялись уже соседние данные...

Нужна помощь, я даже не знаю как правильно сделать, сортировать данные в словаре или уже в таблице...
Если сортировать строки в таблице, то нужно иметь потом возможность обращаться к конкретной строчки, что бы изменить там данные...

Конечная цель такая:
1. сортировка по названию при добавлении элемента в строку, т.е если у меня в таблице уже есть две строчки хлеб и хлеб и пришел батон, что бы он был в самом низу, а если снова пришел хлеб, то он был не под батоном, а под остальным хлебом.

2. сортировка по номеру изделия, не важно хлеб или батон.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.11.2023, 13:16
Ответы с готовыми решениями:

Сортировка в DataGridView
Как сделать сортировку всех строк в DGV по одной колонке, а не только одной колонки? Желательно код.

DataGridView, сортировка
Помогите пжлст сделать сортировку. Таблицу сделал в SQL.

Сортировка в Datagridview
Прошу помощи, нужно отсортировать второй столбец, вот код и что получилось, но там небольшой косяк есть, не пойму как исправить, сортирует...

9
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3439 / 2759 / 575
Регистрация: 04.09.2018
Сообщений: 8,660
Записей в блоге: 3
22.11.2023, 13:22
Vladimirchy, лучше сделай коллекцию, которую привязывай к гриду. Коллекцию проще сортировать по критериям. Грид обновится автоматически.
Цитата Сообщение от Vladimirchy Посмотреть сообщение
dataGridView1.Sort(dataGridView1.Columns[1], ListSortDirection.Ascending);
не стоит так выеживаться..
0
0 / 0 / 0
Регистрация: 14.01.2023
Сообщений: 45
22.11.2023, 14:32  [ТС]
Цитата Сообщение от wizard41 Посмотреть сообщение
лучше сделай коллекцию, которую привязывай к гриду
Нес ложно написать простой пример ?

Пытаюсь сделать вот так:
Dictionary<int, MyClass> Mydict = new Dictionary<int, MyClass>();

dataGridView1.DataSource = Mydict.ToArray();

dataGridView1.Columns[1].DataPropertyName = "Key";
dataGridView1.Columns[0].DataPropertyName = "Value";

НО что то не работает, выводит только key корректно.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3439 / 2759 / 575
Регистрация: 04.09.2018
Сообщений: 8,660
Записей в блоге: 3
22.11.2023, 15:45
Лучший ответ Сообщение было отмечено Vladimirchy как решение

Решение

Vladimirchy, рекомендую начать так:
создай модель изделия:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
    internal class Model
    {
        [DisplayName("Название")]
        public string UnitName { get; set; }
        [DisplayName("Номер изделия")]
        public int UnitNumber { get; set; }
        [DisplayName("Тип")]
        public string UnitType { get; set; }
        [DisplayName("Количество")]
        public int UnitCount { get; set; }
        [DisplayName("ID")]
        public int UnitId { get; set; }
    }
Создай "начальный" список Хлебов:
C#
1
2
3
4
5
6
7
8
9
    List<Model> models = new List<Model>()
    {
        new Model() { UnitName = "Хлеб", UnitNumber = 30, UnitType = "Белый", UnitCount = 20, UnitId = 0 },
        new Model() { UnitName = "Хлеб", UnitNumber = 15, UnitType = "Серый", UnitCount = 50, UnitId = 1 },
        new Model() { UnitName = "Хлеб", UnitNumber = 25, UnitType = "Черный", UnitCount = 100, UnitId = 2 },
        new Model() { UnitName = "Батон", UnitNumber = 88, UnitType = "Белый", UnitCount = 44, UnitId = 3 },
        new Model() { UnitName = "Батон", UnitNumber = 65, UnitType = "Белый", UnitCount = 13, UnitId = 4 },
        new Model() { UnitName = "Батон", UnitNumber = 92, UnitType = "Белый", UnitCount = 25, UnitId = 5 }
    };
Метод обновления дата-грида:
C#
1
2
3
4
    private void GridUpdate()
    {
        dgv1.DataSource = models;
    }
Две кнопки сортировки по Названию и по ИД:
C#
1
2
3
4
5
6
7
8
9
10
11
12
    private void btnSortByName_Click(object sender, EventArgs e)
    {
        models = models.OrderBy(x => x.UnitName).ToList();
        GridUpdate();
    }
 
 
    private void btnSortById_Click(object sender, EventArgs e)
    {
        models = models.OrderBy(x => x.UnitId).ToList();
        GridUpdate();
    }
Результат работы:

Весь код главной формы
C#
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
    public partial class Form1 : Form
    {
        List<Model> models = new List<Model>()
        {
            new Model() { UnitName = "Хлеб", UnitNumber = 30, UnitType = "Белый", UnitCount = 20, UnitId = 0 },
            new Model() { UnitName = "Хлеб", UnitNumber = 15, UnitType = "Серый", UnitCount = 50, UnitId = 1 },
            new Model() { UnitName = "Хлеб", UnitNumber = 25, UnitType = "Черный", UnitCount = 100, UnitId = 2 },
            new Model() { UnitName = "Батон", UnitNumber = 88, UnitType = "Белый", UnitCount = 44, UnitId = 3 },
            new Model() { UnitName = "Батон", UnitNumber = 65, UnitType = "Белый", UnitCount = 13, UnitId = 4 },
            new Model() { UnitName = "Батон", UnitNumber = 92, UnitType = "Белый", UnitCount = 25, UnitId = 5 }
        };
 
 
        public Form1()
        {
            InitializeComponent();
            GridUpdate();
        }
 
 
        private void GridUpdate()
        {
            dgv1.DataSource = models;
        }
 
 
        private void btnSortByName_Click(object sender, EventArgs e)
        {
            models = models.OrderBy(x => x.UnitName).ToList();
            GridUpdate();
        }
 
 
        private void btnSortById_Click(object sender, EventArgs e)
        {
            models = models.OrderBy(x => x.UnitId).ToList();
            GridUpdate();
        }
    }
1
0 / 0 / 0
Регистрация: 14.01.2023
Сообщений: 45
22.11.2023, 16:35  [ТС]
Цитата Сообщение от wizard41 Посмотреть сообщение
рекомендую начать так:
Большое спасибо.
Буду изучать.

Я так понимаю, правильнее все манипуляции делать с коллекциями, а в таблицу просто выводить готовый результат ?

Добавлено через 15 минут
И ещё вопрос, если у меня уже есть заголовки столбцов, я пытаюсь отключить автогенерацию dataGridView1.AutoGenerateColumns = false;
Но тогда у меня добавляются строки, но они пустые...
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3439 / 2759 / 575
Регистрация: 04.09.2018
Сообщений: 8,660
Записей в блоге: 3
22.11.2023, 17:22
Цитата Сообщение от Vladimirchy Посмотреть сообщение
Я так понимаю, правильнее все манипуляции делать с коллекциями, а в таблицу просто выводить готовый результат ?
Да.
Цитата Сообщение от Vladimirchy Посмотреть сообщение
И ещё вопрос, если у меня уже есть заголовки столбцов, я пытаюсь отключить автогенерацию dataGridView1.AutoGenerateColumns = false;
Но тогда у меня добавляются строки, но они пустые...
Не надо никаких автогенераций и добавлений. Все манипуляции производятся с коллекцией, затем обновляется грид. Руками лезть в грид нет необходимости.
0
0 / 0 / 0
Регистрация: 14.01.2023
Сообщений: 45
22.11.2023, 20:43  [ТС]
Цитата Сообщение от wizard41 Посмотреть сообщение
Не надо никаких автогенераций и добавлений. Все манипуляции производятся с коллекцией, затем обновляется грид. Руками лезть в грид нет необходимости.
Понял, буду изучать, как словарь внедрить вместо list)

Последний вопрос, а можно как то узнать номер строки (id строки) с помощью какого ни будь значения, ну например из моего примера: по названию или UnitNumber ?
Не перебирая через цикл все строки
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3439 / 2759 / 575
Регистрация: 04.09.2018
Сообщений: 8,660
Записей в блоге: 3
22.11.2023, 21:04
Цитата Сообщение от Vladimirchy Посмотреть сообщение
как словарь внедрить вместо list
Зачем он тебе нужен? Лишняя работа по извлечению из него нужной записи...
Цитата Сообщение от Vladimirchy Посмотреть сообщение
а можно как то узнать номер строки (id строки) с помощью какого ни будь значения
Можно по разному.
0
0 / 0 / 0
Регистрация: 14.01.2023
Сообщений: 45
22.11.2023, 21:53  [ТС]
Цитата Сообщение от wizard41 Посмотреть сообщение
Зачем он тебе нужен?
Очень удобный поиск по ключу.
0
 Аватар для Andrey-MSK
3360 / 2246 / 388
Регистрация: 14.08.2018
Сообщений: 7,589
Записей в блоге: 4
23.11.2023, 08:45
Цитата Сообщение от Vladimirchy Посмотреть сообщение
Очень удобный поиск по ключу.
А чем не устраивает поиск по коллекции с помощью FirstOrDefault()? Тем более у вас есть поле с ID записи.
Пример
C#
1
SelectedMeasure = Measures.FirstOrDefault(m => m.MeasureID == DrawData.MeasureID);
Где:
Measures - коллекция, в которой ищем
m.MeasureID - поле коллекции, по которому ищем
DrawData.MeasureID - значение, по которому ищем
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.11.2023, 08:45
Помогаю со студенческими работами здесь

Сортировка DataGridView
Здравствуйте!Нужна ваша помощь. На первом скрине мои данные до сортировки А на втором скрине мои данные после того как я нажал...

DataGridView Сортировка
Привет, есть 2 стобца Name и Value. Исходные данные Value 1,2,3,4,5 Но отображатся как 1b 1a 23g и т.д, сортирует по алфавиту и поэтому...

сортировка datagridview
Cоздаю DataTable ResData = new DataTable(ClassName); ResData.Columns.Add(nominal , typeof(string)); ResData.Columns.Add(moshnost ,...

Сортировка в DataGridView
Как отсортировать строки в DataGridView, по 3 столбцу но чтобы сортировка шла вместе со строками вместе со стоками?

Сортировка DataGridView
Добрый день. Возникли проблемы с пониманием сортировки DataGridView. Вычитал с msdn следующие вещи: 1) Программная сортировка ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru