#c# #filter #position #row #dataview
#c# #Фильтр #позиция #строка #просмотр данных
Вопрос:
Я знаю, что есть RowFilter
опция фильтрации по значению столбца. Также существуют методы для выбора N верхних строк. Но как мне отфильтровать и получить строки из (я предпочитаю получать их из того же DataView
dv), скажем, с позиции 10 по позицию 23?
Вот мое требование. У меня есть DataView
dv, в котором 100 строк. У меня есть список из 10 элементов. Когда я выбираю первый элемент в списке, я хочу, чтобы были загружены первые 10 строк dataview (часть загрузки находится в моей программе, оставьте это мне), если я выбираю 2-й элемент в списке, я хочу, чтобы были загружены строки с 11 по 20 и так далее. Я могу выполнить часть со списком, но как выбрать значения dataview на основе номера строки?
Вот как выглядит мой код:
DataSet ds = new DataSet();
DataTable dt = ds.Tables["words"];
DataView dv = new DataView(dt);
Теперь, как получить представление данных из dv на основе позиции строки?
Спасибо.
Комментарии:
1. Одним из простых способов было бы добавить столбец, который будет содержать значения в виде rowindex, и затем вы можете использовать его в RowFilter
2. @V4Vendetta, это может не сработать или стать одинаково сложным (тогда мне снова придется назначить имя столбца для первых десяти строк, затем другое имя для следующих десяти строк, в основном, большая проблема), учитывая, что все строки базы данных создаются «на лету» во время программы и не обязательно должны быть там в следующий момент.
Ответ №1:
Вы можете использовать методы расширения, предоставляемые в Linq, для получения строк по позициям. Например:
// just setting up a table for the sample
DataTable table = new DataTable();
table.Columns.Add("ID", typeof(int));
for (int i = 1; i <= 100; i )
{
table.Rows.Add(i);
}
// grabbing rows 11 through 20 using Linq
DataTable filtered = table.AsEnumerable().Skip(10).Take(10).CopyToDataTable();
Вышеуказанное работает с .NET 3.5 , C # 3.0 . Для чего-то, что работает в более старых версиях C # и .NET, вы можете сделать это вручную, добавив еще немного кода.
// starting by cloning 'table' (see code above)
DataTable filtered = table.Clone();
int skipRows = 10;
int selectRows = 10;
for (int index = skipRows;
index < skipRows selectRows amp;amp; index < table.Rows.Count;
index )
{
filtered.Rows.Add(table.Rows[index].ItemArray);
}
Комментарии:
1. @Anthony, огромное спасибо. будет ли этот метод Linq работать в C # 2.0 (Visual studio 2005)?
2. @nawful, нет, это было бы не так. Я могу обновить, чтобы показать вам код, совместимый с 2.0, дайте мне минутку. Это в основном ручная работа.
3. @Anthony Pegram, можете ли вы объяснить мне (я, конечно, использую c # 2.0), нужно ли мне включать эту строку в мой код
table.Columns.Add("ID", typeof(int));
?? Если да, то как это помогает нашей логике.. Кроме того,for (int i = 1; i <= 100; i ) { table.Rows.Add(i); }
что мы делаем с этой строкой кода? У меня уже есть полностью заполненнаяDataTable
таблица. В этом случае я могу пропустить эту процедуру правильно4. @nawful, игнорируй все эти вещи, создающие
table
объект. Это было просто для того, чтобы предоставить полностью рабочий пример в ответе. Со своей стороны, вы можете начать сfiltered
объекта.5. Да, я это понял. Я уже сделал. просто подтверждение .. 🙂