это на самом деле не проблема, но больше беспокойства, я был бы признателен за какой-либо вклад, пожалуйста.
Winforms C # .net3.5 [sp1] Visual Studio 2008 с использованием Linq2Sql (точнее PLINQO ... что фантастически кстати!). У меня есть набор результатов, возвращающий +/- 19000 строк данных (около 80 байт данных на строку), и я решил перенести метод извлечения данных в фоновый режим и соответствующим образом обновить пользовательский интерфейс. Это отлично работает.
Однако я заметил некоторые различия в производительности при использовании разных типов возврата для моего метода извлечения данных Ling. Я знаю, что все предлагают вернуть List<T>
или IEnumarable<T>
и установить для этого источник данных DataGridView, но, к сожалению, он не поддерживает собственную сортировку объектов. После некоторых поисков я нашел SortableBindingList<T>
на MSDN здесь . Я применил это, и Grid потребовалось меньше секунды, чтобы заполнить себя - однако, когда я щелкаю по столбцу, чтобы отсортировать его, потребовалось чуть больше секунды, чтобы реализовать сортировку.
Затем я решил пойти по пути DataTable, но обнаружил, что метод ToDataTable был удален, но после еще одного поиска нашел способ реализовать его в этой статье MSDN . После его применения я обнаружил, что для заполнения таблицы потребовалось около 2 секунд, но после этого сортировка (по 19000 строк!) Была мгновенной !! Естественно, я придерживался этого подхода.
Также имейте в виду, что я отключил любое редактирование / добавление / удаление в сетке. Сетка предназначена исключительно для отображения данных. Любые другие операции CRUD предоставляются диалоговыми формами в соответствии с текущей выбранной строкой (скрытый столбец первичного ключа).
Вот код, который я использовал для обоих методов:
1) SortableBindingList
//declare private member
private SortableBindingList<PdtAllocation> listAlloc = null;
private void RefreshData() {
bcsDataContext ctx = new bcsDataContext();
try {
listAlloc = new SortableBindingList<PdtAllocation>(ctx.PdtAllocation.ToList());
}
catch (Exception) {
throw;
}
finally {
ctx.Dispose();
}
dataGridView1.DataSource = listAlloc;
}
2) CopyToDatatable
//declare private member
private DataTable dt = null;
private void RefreshData() {
dt = new DataTable();
bcsDataContext ctx = new bcsDataContext();
try {
ctx.PdtAllocation.CopyToDataTable(dt, LoadOption.PreserveChanges);
}
catch (Exception) {
throw;
}
finally {
ctx.Dispose();
}
dataGridView1.DataSource = dt;
}
Теперь я знаю, что это, вероятно, похоже на " вопрос с просьбой и ответом ", но я был бы очень признателен за ваш вклад, а также за любые известные проблемы с маршрутом CopyToDataTable()
. *
Спасибо тебе .... и прошу прощения за запрос looong!