Сортировка столбца Datagridview по тексту, а не по значению - PullRequest
2 голосов
/ 11 января 2010

В моем представлении данных есть столбец, который является столбцом со списком. Я бы хотел, чтобы он сортировался по отображаемому значению (то есть тексту), а не по значению (в данном случае это список целых чисел из базы данных).

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

Ответы [ 7 ]

5 голосов
/ 22 августа 2012

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

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

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

  1. Подключите событие 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 была настройка, чтобы сделать это параметром по умолчанию.

2 голосов
/ 01 февраля 2011

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

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

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 голос
/ 14 июля 2014

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

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

DataGridViewComboBoxColumn col = (DataGridViewComboBoxColumn) dataGridView1.Columns[1];
col.DataSource = items;
col.SortMode = DataGridViewColumnSortMode.Automatic;
1 голос
/ 12 января 2010

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

0 голосов
/ 09 января 2017
DataGridViewComboBoxColumn col = (DataGridViewComboBoxColumn) dataGridView1.Columns[1];
col.DataSource = items;
col.SortMode = DataGridViewColumnSortMode.Automatic;

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

0 голосов
/ 15 июня 2012

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

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

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

0 голосов
/ 15 октября 2010

Видимо, это невозможно. Я искал то же самое, и я не уверен, почему никто бы не подумал, что это важная особенность. Вот ссылка на оригинальный вопрос и ответ от Microsoft Rep.

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

Привет Мэтт,

Спасибо за публикацию.

Если у вас есть DataGridViewComboBoxColumn в вашем DataGridView, вы должны установить Источник данных DataGridView для заполнить данные в нем. Это сказать, Вы должны привязать DataGridView к DataSource.

Если вы установите SortMode для DataGridViewComoboBoxColumn to Автоматически, вы можете отсортировать этот столбец по щелкнув по нему Сортировка основана на значение ячеек в столбце, а не 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

  1. Используя DataView и установите его свойство Sort

Вы можете обратиться к ссылке ниже для больше информации о option4: http://msdn2.microsoft.com/en-us/library/system.data.dataview.sort(d=ide).as ПВ

Кажется, что только option2 и option3 может быть применен для сортировки DataGridViewComboBoxColumn на основе FormattedValue. Тем не менее, эти два параметры применяются только при условии что DataGridView НЕ ограничен к источнику данных.

Так что, на мой взгляд, невозможно сортировать DataGridViewComboBoxColumn основанный на FormattedValue.

Если у вас есть другие проблемы, пожалуйста, не стесняйтесь, дайте мне знать.

С уважением, Линда Лю, Microsoft Online Поддержка сообщества

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...