Сортировка столбца Datagridview по тексту, а не по значению

2

У меня есть столбец в моем datagridview, который является столбцом combobox. Я бы хотел, чтобы он отсортировал по нему отображаемое значение (т.е. Текст) вместо его значения (в этом случае список int из базы данных).

Как я могу это сделать?

  • 0
    Можете ли вы включить код, чтобы показать, как вы в настоящее время заполняете свой comboBox?
  • 0
    Он заполняется из наборов данных
Теги:
winforms

7 ответов

4

Вы можете сделать это, переопределив событие SortCompare на DataGridView, которое:

Происходит, когда DataGridView сравнивает два значения ячейки для выполнения операции сортировки

и всегда будет сортировать значение Display вместо значения по умолчанию.

  • Подключите SortCompare к DataGridView следующим образом:
this.dataGridView1.SortCompare += new DataGridViewSortCompareEventHandler(dataGridView1_SortCompare);
  1. Затем добавьте обработчик событий для сортировки всех столбцов по 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 была настройка, чтобы сделать это по умолчанию.

  • 0
    Это событие не для меня!
  • 2
    «Это событие происходит, только если свойство DataSource не установлено, а значение свойства VirtualMode равно false». - оказывается бесполезным, если D ataGridView связан! msdn.microsoft.com/en-us/library/...
2

Невозможно это сделать вообще. Вот как я это сделал.

Что вам нужно для создания виртуального столбца, заполненного связанным значением. Вам необходимо будет программно сделать это.

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;
}
1

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

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

DataGridViewComboBoxColumn col = (DataGridViewComboBoxColumn) dataGridView1.Columns[1];
col.DataSource = items;
col.SortMode = DataGridViewColumnSortMode.Automatic;
1

Я бы посмотрел на Как настроить сортировку в элементе управления DataGridView Windows Forms. Существует три разных способа сортировки в этой статье. Несколько других сообщений, которые могут помочь также: Как сортировать dataagridview databound и Пользовательский вид datagridview

  • 0
    Это событие никогда не происходит, я уже пробовал таким образом, и это не сработало.
  • 0
    Событие SortCompare не возникает, когда DataGridView привязан к данным. Из MSDN: «Это событие происходит, только если свойство DataSource не установлено, а значение свойства VirtualMode равно false».
Показать ещё 1 комментарий
0
DataGridViewComboBoxColumn col = (DataGridViewComboBoxColumn) dataGridView1.Columns[1];
col.DataSource = items;
col.SortMode = DataGridViewColumnSortMode.Automatic;

Этот код позволяет сортировать по идентификатору не по тексту ComboBox.

0

На самом деле это довольно просто, это пример кода, который работал у меня:

DataGridViewComboBoxColumn col = (DataGridViewComboBoxColumn) dataGridView1.Columns[1];
col.DataSource = items;
col.SortMode = DataGridViewColumnSortMode.Automatic;

Третья строка - это ключ.

0

По-видимому, это невозможно. Я искал то же самое, и я не знаю, почему никто бы не подумал, что это важная функция. Вот ссылка на исходный вопрос и ответ от Microsoft Rep.

http://www.webnewsgroups.net/vbnet/t25706-vb2005-sort-datagridview-text-formattedvalue-combobox-column-instead-underlying-value.aspx

Привет Мэтт,

Спасибо за сообщение.

Если у вас есть 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 Поддержка сообщества

Ещё вопросы

Сообщество Overcoder
Наверх
Меню