WinForm DatagridView Сортировка Числовых Столбцов

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

У меня есть десятичные дроби в определенном столбце. Но когда дело доходит до упорядочения по этому десятичному столбцу, он упорядочивает его неправильно. Например :

процесс пуска в порядке может быть :

  • 0.56
  • 3.45
  • 500.89
  • 20078.90
  • 1.56
  • 100.29
  • 2.39

концовка порядок быть :

  • 0.56
  • 100.29
  • 1.56
  • 20078.90
  • 2.39
  • 3.45
  • 500.89

Как вы можете видеть, он заказывает его, начиная с первого числа. А потом приказывает вот так.

Я подумал, что, возможно, я мог бы установить столбец в другой "ColumnType", и это может автоматически сделать это. Но нет" числовых "или" десятичных " типов столбцов.

Я был на MSDN поиск проблемы, и я мог бы найти метод "сортировки", который я могу использовать в DataGridView. Но объяснение было выше моего понимания, и в примерах не использовались цифры, только текст, поэтому я не мог понять, как я должен был переключать вещи.

любая помощь была бы очень признательна.

6 ответов


вы можете решить эту проблему, добавив обработчик для события SortCompare в DataGridView со следующим кодом:

private void dataGridView1_SortCompare(object sender, DataGridViewSortCompareEventArgs e)
{
    if (e.Column.Index == 0)
    {
        if (double.Parse(e.CellValue1.ToString()) > double.Parse(e.CellValue2.ToString()))
        {
            e.SortResult = 1;
        }
        else if (double.Parse(e.CellValue1.ToString()) < double.Parse(e.CellValue2.ToString()))
        {
            e.SortResult = -1;
        }             
        else
        {
            e.SortResult = 0;
        }
        e.Handled = true;
   }
}

из MSDN есть это описание значений SortResult:

меньше нуля, если первая ячейка будет сортировка перед второй ячейкой; ноль если первая и вторая ячейки имеют эквивалентные значения; больше нуля если вторая ячейка будет отсортирована перед первой камерой.

обратите внимание, что в моем тестовый стенд единственный числовой столбец был первым (с индексом 0), поэтому у меня есть проверка индекса столбца.

кроме того, в зависимости от ваших потребностей и данных вы можете уточнить мой код - например, мой код выдаст исключение, если по какой-то причине у вас есть не числовые данные в столбце.

вы, вероятно, видели его, но здесь - это ссылка на страницу MSDN при настройке сортировки DataGridView. Как вы говорите, они имеют дело только с текстом.


у меня была та же проблема. Я попытался использовать обработчик событий, как упоминал Дэвид Холл. Я использовал свойство ValueType при определении DataGridView. Теперь он сортируется как двойные, не требуется пользовательский код обработчика событий

dataGridView1.Columns[int index].ValueType = typeof(double);

вы также можете отформатировать столбец с помощью

dataGridView2.Columns[int index].DefaultCellStyle.Format = string format;

числовые типы имеют встроенную функцию CompareTo, которая может использоваться как SortResult события SortCompare.

    private void dataGridView_SortCompare(object sender, DataGridViewSortCompareEventArgs e)
    {
        if (e.Column.Index == 0)
        {
            e.SortResult = int.Parse(e.CellValue1.ToString()).CompareTo(int.Parse(e.CellValue2.ToString()));
            e.Handled = true;
        }
    }

это, конечно, если вы знаете тип, который был помещен в DataGridView для начала.


тип столбца базы данных должен быть int или double или float, а не varchar или что-то еще.... Поэтому вам нужно изменить тип значения в базе данных... Вам не нужно писать какой-либо код или что-то, что он напрямую сортирует, когда вы нажимаете на заголовок столбца...


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

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


ваша проблема-это datagridview сортируется по строкам. Попробуйте кастинг string to float когда вы копируете эту ячейку в datagrid.