Сортировка числовых столбцов Winform DatagridView - PullRequest
8 голосов
/ 07 января 2010

Я использую просто простой 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 ]

8 голосов
/ 07 января 2010

Вы можете решить это, добавив обработчик для события 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. Как вы говорите, они имеют дело только с текстом.

6 голосов
/ 12 сентября 2012

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

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

Вы также можете отформатировать столбец, используя

dataGridView2.Columns[int index].DefaultCellStyle.Format = string format;
1 голос
/ 08 марта 2013

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

1 голос
/ 17 октября 2012

Числовые типы имеют встроенную функцию 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 для начала.

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

Ваша проблема: datagridview сортирует по строке.Попробуйте привести string к float при копировании этой ячейки в datagrid.

0 голосов
/ 07 января 2010

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

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

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