none
Сортировка столбца datagridview, привязанного к данным, по выводимому значению RRS feed

  • Вопрос

  • Имеется 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