Настроить сортировку по DataTable в C #? - PullRequest
1 голос
/ 22 января 2010

Это вопрос C # Winform. У меня есть DataGridView, который привязан к DataTable. Я создаю DataTable сам, который несколько экземпляров DataColumn. Когда DataTable привязан к DataGridView, по умолчанию каждый столбец можно сортировать, щелкая заголовки DataGridView.

Но поведение сортировки - это что-то "по умолчанию". Похоже, это отсортировано по строке. Это верно, даже если я поставлю это в качестве своего кода:

DataColumn dc = new DataColumn ("MyObjectColumn", typeof (MyObject));

И MyObject переопределил ToString () и реализовал интерфейс IComparable. Это означает, что даже если бы я рассказал DataTable, как сортировать специальный столбец с помощью реализации интерфейса IComparable, DataGridView все равно не сделает этого так, как я ожидаю.

Так как я могу позволить DataTable сортировать данные так, как я хочу?

Спасибо за ответы.

Ответы [ 2 ]

1 голос
/ 22 января 2010

Я бы рекомендовал использовать DefaultView для DataTable. Он имеет некоторые встроенные функции сортировки, которые немного более расширяемы. Самым простым является RowFilter, но я не уверен, будет ли это именно то, что вам нужно, если ваши типы данных будут переопределены как .ToString () на уровне таблицы.

РЕДАКТИРОВАТЬ: добавлен фрагмент кода

Пользовательский метод, подобный этому, который, возможно, даже переопределяет или вызывается во время события сортировки вашего DataGridView, мог бы сортировать DataView до того, как на самом деле происходит привязка. Но, насколько я понимаю, IComparable никогда не вызывается, если вы не укажете, что он будет вызван.

protected void SortGrid()
{
    System.Data.DataView dv = myDataTable.DefaultView;

    myOjbect comparer = new MyObject();

   // Comparer specifics go here. Sort order, column/fieldname etc
   // or any custom properties used in sorting

   dv.Sort(comparer)

   dgMyGrid.DataSource = dv
   dgMyGrid.DataBind()

}
0 голосов
/ 02 сентября 2010

Мне пришлось иметь дело с этим сегодня. Я реализовал естественную сортировку (шляпный совет: Естественный порядок сортировки в C # ) и мне пришлось отсортировать DataTable. Это скорее метод с низким fi, но он помог мне с небольшим набором данных, с которым я работаю.

Я создаю отношение ключ / значение между моим столбцом сортировки и самим DataRow и помещаю его в SortedList, созданный с помощью IComparer.

DataTable myDataTable = {all my data...}
SortedList myDataNaturallySorted = new SortedList(new NaturalComparer());

foreach (DataRow dataRow in myDataTable.AsEnumerable())
    myDataNaturallySorted.Add(dataRow["columWithKeyName"].ToString(), dataRow);

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

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