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

Я знаю, что есть опция RowFilter для фильтрации по значению столбца. Также есть методы выбора верхних N строк. Но как мне отфильтровать и получить строки из (я предпочитаю получать их в тот же DataView dv), скажем, с позиции 10 по позицию 23?

Вот мое требование. У меня есть DataView dv, который имеет 100 строк. У меня есть список с 10 элементами. Когда я выбираю первый элемент в списке, я хочу, чтобы были загружены первые 10 строк представления данных (загрузочная часть находится в моей программе, оставьте это мне), если я выберу 2-й элемент в списке, я хочу, чтобы строки с 11 по 20 были загружены и так далее. Я могу сделать часть списка, но как выбрать значения представления данных на основе номера строки?

Вот как выглядит мой код:

            DataSet ds = new DataSet();
            DataTable dt = ds.Tables["words"];
            DataView dv = new DataView(dt);

Теперь, как получить представление данных из dv на основе позиции строки?

Спасибо.


person nawfal    schedule 22.04.2011    source источник
comment
Одним из простых способов было бы добавить столбец, который будет содержать значения в качестве индекса строки, и затем вы можете использовать его в RowFilter.   -  person V4Vendetta    schedule 22.04.2011
comment
@ V4Vendetta, это может не сработать или стать столь же сложным (тогда я снова должен назначить имя столбца для первых десяти строк, затем другое имя для следующих десяти строк, в основном это большая проблема), учитывая, что все строки базы данных создаются на лету во время программе и не обязательно быть там в следующее мгновение.   -  person nawfal    schedule 22.04.2011


Ответы (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 && index < table.Rows.Count; 
     index++)
{
    filtered.Rows.Add(table.Rows[index].ItemArray);
}
person Anthony Pegram    schedule 22.04.2011
comment
@Энтони, большое спасибо. будет ли этот метод Linq работать в C # 2.0 (visual studio 2005)? - person nawfal; 22.04.2011
comment
@nawful, нет, не будет. Я могу обновить, чтобы показать вам код, совместимый с 2.0, дайте мне минутку. В основном это ручная работа. - person Anthony Pegram; 22.04.2011
comment
@ Энтони Пеграм, можешь ли ты объяснить мне (конечно, я использую С# 2.0), нужно ли мне включать эту строку в мой код table.Columns.Add("ID", typeof(int)); ?? Если да, то как это поможет нашей логике. Кроме того, for (int i = 1; i <= 100; i++) { table.Rows.Add(i); } что мы делаем с этой строкой кода? У меня уже есть полностью заполненная таблица DataTable. В таком случае я могу пропустить эту процедуру прямо - person nawfal; 22.04.2011
comment
@nawful, игнорируй все эти вещи, создающие объект table. Это было просто для того, чтобы предоставить полностью рабочий пример в ответе. Со своей стороны, вы можете начать с объекта filtered. - person Anthony Pegram; 22.04.2011
comment
Да я понял это. Я уже сделал. просто подтверждение.. :) - person nawfal; 22.04.2011