Лучший отвечающий
Сортировка столбца datagridview, привязанного к данным, по выводимому значению

Вопрос
-
Имеется datagridview, привязанный к данным. Столбцы создаются программно. Также имеется комбобокс-столбец, он тоже привязана к данным. Значения в данной колонке можно редактировать. Проблема состоит в том, что при сортировке столбца, строки сортируются по фактическому значению ячейки, а не по тому, которое отображается, т.е. по ValueMember. А для пользователя было бы лучше если бы они сортировались по тому значению, которое он видит, т.е. по DisplayMember. Сортировать в ручную нельзя, т.к. таблица привязана к данным. В качестве данных обязательно должен быть DataTable, реализация через List не подходит. Прилагаю код, который поможет лучше понять меня.
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Collections; namespace UserInterfaceTest { public partial class DataGridSortingTestForm : Form { DataSet allTables; public DataGridSortingTestForm() { InitializeComponent(); } private void DataGridSortingTestForm_Load(object sender, EventArgs e) { allTables = new DataSet(); { var cars = new DataTable("cars"); var id = cars.Columns.Add("id", typeof(int)); cars.Columns.Add("name", typeof(string)); cars.Columns.Add("driver_id", typeof(int)); cars.PrimaryKey = new DataColumn[] { id }; allTables.Tables.Add(cars); } { var drivers = new DataTable("drivers"); var id = drivers.Columns.Add("id", typeof(int)); drivers.Columns.Add("name", typeof(string)); drivers.PrimaryKey = new DataColumn[] { id }; allTables.Tables.Add(drivers); } allTables.Relations.Add(allTables.Tables["drivers"].Columns["id"], allTables.Tables["cars"].Columns["id"]); FillTables(); FillGrid(); } private void FillGrid() { dataGridView1.AutoGenerateColumns = false; var cars = allTables.Tables["cars"]; dataGridView1.DataSource = cars; var id = new DataGridViewTextBoxColumn(); id.Name = "id"; id.HeaderText = "id"; id.DataPropertyName = "id"; var name = new DataGridViewTextBoxColumn(); name.Name = "name"; name.HeaderText = "Марка"; name.DataPropertyName = "name"; var driverID = new DataGridViewComboBoxColumn(); driverID.Name = "driverId"; driverID.HeaderText = "Водитель"; driverID.DataSource = allTables.Tables["drivers"]; driverID.ValueMember = "id"; driverID.DisplayMember = "name"; driverID.DataPropertyName = "driver_id"; dataGridView1.Columns.AddRange(id, name, driverID); driverID.SortMode = DataGridViewColumnSortMode.Automatic; } private void FillTables() { var drivers = allTables.Tables["drivers"]; drivers.Rows.Add(1, "Akmalov"); drivers.Rows.Add(2, "Shirokov"); drivers.Rows.Add(3, "Karpov"); var cars = allTables.Tables["cars"]; cars.Rows.Add(1, "LADA", 1); cars.Rows.Add(2, "KAMAZ", 3); cars.Rows.Add(3, "BMW", 2); } } }
19 февраля 2013 г. 13:00
Ответы
-
Привет
Попробуйте решить эту проблему как предлагается здесь - Sorting Datagridview's Column by text and not value с помощью добавления виртуального столбца, который будет содержать текстовые данные и по которому будет идти сортировка. Фактически это не очень красивое решение, но других решений скорее всего нет. Вот сырое решение для вашей ситуации:
private void OrderByComboBoxColumn() { // Add the temp Column if it doesnt exist if (!allTables.Tables[0].Columns.Contains("TempColumn")) allTables.Tables[0].Columns.Add("TempColumn", typeof(string)); foreach (DataGridViewRow row in dataGridView1.Rows) { if (!row.IsNewRow) allTables.Tables[0].Rows[row.Index]["TempColumn"] = row.Cells[2].FormattedValue; } allTables.Tables[0].DefaultView.Sort = "TempColumn ASC"; } private void button1_Click(object sender, EventArgs e) { OrderByComboBoxColumn(); }
Для связи [mail]
- Предложено в качестве ответа Varlamov Oleg 21 февраля 2013 г. 12:33
- Помечено в качестве ответа ShirokovAE 24 февраля 2013 г. 10:09
21 февраля 2013 г. 9:19