Как отфильтровать просмотр данных из i-й строки в j-ю строку? (C #)

#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. Да, я это понял. Я уже сделал. просто подтверждение .. 🙂