У меня есть столбец в моем datagridview, который является столбцом combobox. Я бы хотел, чтобы он отсортировал по нему отображаемое значение (т.е. Текст) вместо его значения (в этом случае список int из базы данных).
Как я могу это сделать?
Вы можете сделать это, переопределив событие SortCompare
на DataGridView
, которое:
Происходит, когда DataGridView сравнивает два значения ячейки для выполнения операции сортировки
и всегда будет сортировать значение Display вместо значения по умолчанию.
SortCompare
к DataGridView следующим образом:this.dataGridView1.SortCompare += new DataGridViewSortCompareEventHandler(dataGridView1_SortCompare);
Cell
FormattedValue
, а не свойство Value
(это значение по умолчанию).void dataGridView1_SortCompare(object sender, DataGridViewSortCompareEventArgs e)
{
var dgv = (DataGridView) sender
string value1 = dgv.Rows[e.RowIndex1].Cells[e.Column.Index].FormattedValue.ToString();
string value2 = dgv.Rows[e.RowIndex2].Cells[e.Column.Index].FormattedValue.ToString();
e.SortResult = System.String.Compare(value1, value2);
e.Handled = true;
}
Работает для меня и, надеюсь, поможет другим людям. Я просто хочу, чтобы на DataGridView
была настройка, чтобы сделать это по умолчанию.
Невозможно это сделать вообще. Вот как я это сделал.
Что вам нужно для создания виртуального столбца, заполненного связанным значением. Вам необходимо будет программно сделать это.
private void OrderByComboBoxColumn()
{
// Add the temp Column if it doesnt exist
if (!dataset.TABLE.Columns.Contains("TempColumn"))
dataset.TABLE.Columns.Add("TempColumn", typeof(string));
foreach (DataSetRow row in dataset.TABLE)
row["TempColumn"] = GetBoundValue(row.COMBOBOX_ID);
dataview.Sort = "TempColumn ASC";
}
private string GetBoundValue(int id)
{
// get the string however your id matches the bound value
return string;
}
Как отметил mnield, приведенный выше код не будет работать, если у нас есть столбец ComboBox
, и пользователь хочет иметь возможность добавлять строки.
Если пользователь хочет добавить новые строки, мы должны использовать следующий код:
DataGridViewComboBoxColumn col = (DataGridViewComboBoxColumn) dataGridView1.Columns[1];
col.DataSource = items;
col.SortMode = DataGridViewColumnSortMode.Automatic;
Я бы посмотрел на Как настроить сортировку в элементе управления DataGridView Windows Forms. Существует три разных способа сортировки в этой статье. Несколько других сообщений, которые могут помочь также: Как сортировать dataagridview databound и Пользовательский вид datagridview
DataGridViewComboBoxColumn col = (DataGridViewComboBoxColumn) dataGridView1.Columns[1];
col.DataSource = items;
col.SortMode = DataGridViewColumnSortMode.Automatic;
Этот код позволяет сортировать по идентификатору не по тексту ComboBox.
На самом деле это довольно просто, это пример кода, который работал у меня:
DataGridViewComboBoxColumn col = (DataGridViewComboBoxColumn) dataGridView1.Columns[1];
col.DataSource = items;
col.SortMode = DataGridViewColumnSortMode.Automatic;
Третья строка - это ключ.
По-видимому, это невозможно. Я искал то же самое, и я не знаю, почему никто бы не подумал, что это важная функция. Вот ссылка на исходный вопрос и ответ от Microsoft Rep.
Привет Мэтт,
Спасибо за сообщение.
Если у вас есть DataGridViewComboBoxColumn в вашем DataGridView, вы должны установить DataSource DataGridView для заполнять данные в нем. Чтобы сказать, вы должны привязать DataGridView к DataSource.
Если вы установили SortMode DataGridViewComoboBoxColumn для Автоматически вы можете сортировать этот столбец по щелкнув его. Сортировка основана на значение ячеек в столбце, а не FormattedValue. Если ты хочешь сортировать этот столбец на основе FormattedValue, кажется, что у вас есть для настройки сортировки.
Существует несколько вариантов настройки вроде DataGridView. Эти параметры перечислены ниже. 1. Вызов DataGridView.Sort(DataGridViewColumn, ListSortDirection) метод 2. Обращение с событием SortCompare DataGridView 3. Вызов метода DataGridView.Sort(IComparer)
Вы можете обратиться к приведенной ниже ссылке для более подробную информацию о вышеуказанных трех опции: http://msdn2.microsoft.com/en-us/library/ms171608(d=ide).aspx
- Используя DataView и установите его свойство Сортировка
Вы можете ссылаться на ссылку ниже для дополнительная информация по опции4: http://msdn2.microsoft.com/en-us/library/system.data.dataview.sort(d=ide).asПВ
Кажется, что только option2 и option3 может применяться для сортировки DataGridViewComboBoxColumn на основе FormattedValue. Однако эти два варианты применяются только при условии что DataGridView НЕ ограничен к источнику данных.
Так что, на мой взгляд, невозможно сортировать DataGridViewComboBoxColumn на основе FormattedValue.
Если у вас есть другие проблемы, пожалуйста, не стесняйтесь, дайте мне знать.
С уважением, Линда Лю Microsoft Online Поддержка сообщества