Просмотр данных в DataTable
Обновлен: November 2007
Доступ к содержимому DataTable можно получить с помощью коллекций Rows и Columns объекта DataTable. Для возвращения подмножества данных в DataTable в соответствии с условиями поиска, порядком сортировки и состоянием строк можно также использовать метод Select. Кроме того, при поиске конкретной строки по значению первичного ключа можно использовать метод Find класса DataRowCollection.
Метод Select объекта DataTable возвращает набор объектов DataRow, соответствующих заданным критериям. Метод Select принимает необязательные аргументы критерия фильтра, выражения сортировки и DataViewRowState. Критерий фильтра определяет возвращаемые строки на основе значений DataColumn, например LastName = 'Smith'. Выражение сортировки следует стандартным соглашениям SQL об упорядочивании столбцов, например по LastName ASC, FirstName ASC. Правила написания выражений см. в свойстве Expression класса DataColumn.
Совет. |
---|
Если выполняется несколько вызовов метода Select объекта DataTable, можно повысить производительность, создав вначале представление DataView для таблицы DataTable. При создании DataView индексируются строки таблицы. Метод Select использует этот индекс, что значительно сокращает время формирования результата. Сведения о создании представления DataView для таблицы DataTable см. в разделе Объекты DataView (ADO.NET). |
Метод Select определяет, какую версию строк нужно просмотреть или обработать, на основе DataViewRowState. В следующей таблице показаны возможные значения перечисления DataViewRowState.
Значение DataViewRowState |
Описание |
---|---|
CurrentRows |
Текущие строки, включая не изменившиеся, добавленные и измененные. |
Deleted |
Удаленная строка. |
ModifiedCurrent |
Текущая версия, которая является измененной версией исходных данных. (См. ModifiedOriginal.) |
ModifiedOriginal |
Исходная версия всех измененных строк. Текущая версия доступна при использовании параметра ModifiedCurrent. |
Added |
Новая строка. |
None |
Отсутствует. |
OriginalRows |
Исходные строки, включая неизменившиеся и удаленные. |
Unchanged |
Неизменившаяся строка. |
В следующем примере объект DataSet фильтруется таким образом, что возвращаются только строки, параметр DataViewRowState для которых имеет значение CurrentRows.
Dim column As DataColumn
Dim row As DataRow
Dim currentRows() As DataRow = _
workTable.Select(Nothing, Nothing, DataViewRowState.CurrentRows)
If (currentRows.Length < 1 ) Then
Console.WriteLine("No Current Rows Found")
Else
For Each column in workTable.Columns
Console.Write(vbTab & column.ColumnName)
Next
Console.WriteLine(vbTab & "RowState")
For Each row In currentRows
For Each column In workTable.Columns
Console.Write(vbTab & row(column).ToString())
Next
Dim rowState As String = _
System.Enum.GetName(row.RowState.GetType(), row.RowState)
Console.WriteLine(vbTab & rowState)
Next
End If
DataRow[] currentRows = workTable.Select(
null, null, DataViewRowState.CurrentRows);
if (currentRows.Length < 1 )
Console.WriteLine("No Current Rows Found");
else
{
foreach (DataColumn column in workTable.Columns)
Console.Write("\t{0}", column.ColumnName);
Console.WriteLine("\tRowState");
foreach (DataRow row in currentRows)
{
foreach (DataColumn column in workTable.Columns)
Console.Write("\t{0}", row[column]);
Console.WriteLine("\t" + row.RowState);
}
}
Метод Select может использоваться для возвращения строк с разными значениями RowState или значениями полей. Следующий пример возвращает массив строк DataRow, который ссылается на все удаленные строки и возвращает другой массив DataRow, ссылающийся на строки, упорядоченные по CustLName, в которых столбец CustID больше 5. Сведения о просмотре данных в строке Deleted см. в разделе Состояния и версии строк.
' Retrieve all deleted rows.
Dim deletedRows() As DataRow = workTable.Select(Nothing, Nothing, DataViewRowState.Deleted)
' Retrieve rows where CustID > 5, and order by CustLName.
Dim custRows() As DataRow = workTable.Select( _
"CustID > 5", "CustLName ASC")
// Retrieve all deleted rows.
DataRow[] deletedRows = workTable.Select(
null, null, DataViewRowState.Deleted);
// Retrieve rows where CustID > 5, and order by CustLName.
DataRow[] custRows = workTable.Select("CustID > 5", "CustLName ASC");