Десятичное число DataGridView не сортируется

Хорошо, у меня есть DataGridView, который привязан к данным, например:

dataGridViewChartOre.AutoGenerateColumns = false;
dataGridViewChartOre.DataSource = xml.GetOreChart();
dataGridViewChartOre.DataMember = "ore";

Все столбцы были созданы вручную через пользовательский интерфейс. А столбцы состоят из 1 строки, 10 знаков после запятой. Где последний столбец - валюта.

Теперь получить валюту для отображения в dataGridView было быстро решить один раз, я вспомнил, что ввод из xml всегда был строкой. Используя этот подход: (Нашел еще где-то на этом сайте.)

private void dataGridViewChartOre_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
    {
        string value = e.Value.ToString();
        decimal d;

        if (decimal.TryParse(value, out d))
        {
            e.Value = d;
        }
    }

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

  • Использование float вместо десятичных дробей.
  • Использование SortCompare // SortResult

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

8616
8225
785995
7833
78069
773403
750268
74521
738249
714541
70972
and so on

Итак, как это исправить, и даже лучше, если бы кто-нибудь мог объяснить мне, почему это происходит?

Кроме того, кстати, как изменить CurrencySymbol? Я хочу использовать другой символ во всей программе, однако он должен сохранить обычный формат даты и времени в США.


person Nikolaj Thorup Jensen    schedule 06.07.2013    source источник
comment
Вы уверены, что ваши DataGridViewColumns, которые добавляются вручную, имеют десятичный тип? Ваши соответствующие столбцы DataSource должны быть сначала преобразованы в десятичные числа.   -  person King King    schedule 07.07.2013


Ответы (1)


Ваш тип столбца DataGridView зависит от фактического типа базовых данных. Вы не можете изменить тип базовых данных, то, что вы изменили в обработчике событий CellFormatting, — это просто значение ячейки. Если тип значения ячейки изменен так, что его тип не совпадает с типом столбца-владельца (который определяется базовыми данными), будет выброшено FormatException. Я предполагаю, что ваш код (в обработчике событий CellFormatting) выдаст это исключение, если вы добавите e.FormattingApplied = true; после изменения значения ячейки, что фактически повлияет на форматирование, но вы его пропустили).

Вы упомянули событие SortCompare и сказали, что оно не помогло, но я думаю, что вы могли использовать его неправильно. Я пробовал это решение с ним, и это сработало:

private void dataGridView1_SortCompare(object sender, DataGridViewSortCompareEventArgs e)
{
   e.SortResult = Compare(e.CellValue1.ToString(), e.CellValue2.ToString());
}
private int Compare(string a, string b)
{
   return decimal.Parse(a).CompareTo(decimal.Parse(b));
}
person King King    schedule 06.07.2013