Для первого вопроса - IIRC вы не можете сортировать DataView с помощью компаратора. Если вам просто нужно отсортировать поле численно, вы должны быть уверены, что тип столбца числовой, а не строковый. Некоторый код поможет разобраться в этом.
Для второго вопроса вы также не можете сделать это непосредственно в DataView. Если вам действительно нужно отсортировать записи на основе некоторой обработки данных в столбце, тогда я скопирую данные в массив и использую IComparer в массиве:
DataView dv = new DataView(dt);
ArrayList lst = new ArrayList();
lst.AddRange(dv.Table.Rows);
lst.Sort(new MyComparer());
foreach (DataRow dr in lst)
Debug.WriteLine(dr[0]);
Сравнитель выглядит так:
class MyComparer : IComparer
{
public int Compare(object x, object y)
{
DataRow rx = x as DataRow;
DataRow ry = y as DataRow;
string datax = (string)rx[colName];
string datay = (string)ry[colName];
// Process datax and datay here then compare them (ASC)
return datax.CompareTo(datay);
}
}
Это увеличит потребление памяти, поэтому вам нужно подумать, возможно, есть лучший способ предварительной обработки данных в таблице, чтобы можно было напрямую отсортировать DataView по столбцу.
P.S. colName - это имя столбца, по которому вы хотите отсортировать. Замените комментарий фактическим кодом, чтобы извлечь информацию о сортировке из столбца. Вы также можете использовать этот метод для извлечения информации сортировки из нескольких столбцов. Просто используйте что-то вроде этого:
int cmp = colAx.CompareTo(colAy);
if (cmp != 0)
return cmp;
cmp = colBy.CompareTo(colBx);
return cmp;
Это будет сравнивать возрастание по значениям colA и затем убывание по значениям colB (не то, что второе сравнение имеет сначала y , а затем x )
Редактировать : ОК, я неправильно истолковал термин, разделенный запятыми. Из вашего примера я думаю, что вы имели в виду числа с тысячами разделителей (1 000 000 = один миллион). Если вы храните такие числа в базе данных, то это должно быть то, что вы используете текстовое поле, и это должно быть причиной того, что ваш порядок сортировки является буквенно-цифровым.
Исходя из этого предположения, я бы предложил изменить тип этого столбца на числовой, сохранить обычные числа внутри и отформатировать их (с тысячами разделителей) только при их отображении. Таким образом, сортировка должна работать непосредственно в DataView, и вам не нужно копировать данные.