行の検索 (ADO.NET)
DataView の Find メソッドと FindRows メソッドを使用すると、並べ替えキーの値に基づいて行を検索できます。 Find メソッドと FindRows メソッドによる検索で、値の大文字と小文字が区別されるかどうかは、基になる DataTable の CaseSensitive プロパティによって決まります。 検索結果を返すには、検索値が既存の並べ替えキーの値と完全に一致している必要があります。
Find メソッドは、検索条件に一致する DataRowView のインデックスの整数値を返します。 複数の行が検索条件に一致する場合は、一致した最初の DataRowView が返されます。 一致する DataRowView がない場合には、Find は -1 を返します。
複数の行に一致する検索結果を返すには、FindRows メソッドを使用します。 FindRows は Find メソッドと同様に機能しますが、DataView 内で条件に一致するすべての行を参照する DataRowView 配列を返す点が Find メソッドとは異なります。 一致する行が見つからない場合、DataRowView 配列は空になります。
Find メソッドまたは FindRows メソッドを使用するには、並べ替え順序を指定する必要があります。並べ替え順序を指定するには、ApplyDefaultSort を true に設定するか、または Sort プロパティを使用します。 並べ替え順序が指定されないと、例外がスローされます。
Find メソッドと FindRows メソッドには、並べ替え順序に指定されている列の数と長さが一致する値配列を入力として渡します。 1 つの列に基づく並べ替えの場合は、1 つの値を渡します。 複数列に基づく並べ替えの場合は、オブジェクトの配列を渡します。 複数列に基づく並べ替えでは、オブジェクト配列の値の順序が、DataView の Sort プロパティに指定されている列の順序と一致する必要があります。
1 列の並べ替え順序が設定されている DataView に対して Find メソッドを呼び出すコード サンプルを次に示します。
Dim custView As DataView = _
New DataView(custDS.Tables("Customers"), "", _
"CompanyName", DataViewRowState.CurrentRows)
Dim rowIndex As Integer = custView.Find("The Cracker Box")
If rowIndex = -1 Then
Console.WriteLine("No match found.")
Else
Console.WriteLine("{0}, {1}", _
custView(rowIndex)("CustomerID").ToString(), _
custView(rowIndex)("CompanyName").ToString())
End If
DataView custView = new DataView(custDS.Tables["Customers"], "",
"CompanyName", DataViewRowState.CurrentRows);
int rowIndex = custView.Find("The Cracker Box");
if (rowIndex == -1)
Console.WriteLine("No match found.");
else
Console.WriteLine("{0}, {1}",
custView[rowIndex]["CustomerID"].ToString(),
custView[rowIndex]["CompanyName"].ToString());
Sort プロパティで複数の列が指定される場合は、次のコード サンプルに示すように、各列に対応する検索値を Sort プロパティで指定されている順序で格納したオブジェクト配列を渡す必要があります。
Dim custView As DataView = _
New DataView(custDS.Tables("Customers"), "", _
"CompanyName, ContactName", _
DataViewRowState.CurrentRows)
Dim foundRows() As DataRowView = _
custView.FindRows(New object() {"The Cracker Box", "Liu Wong"})
If foundRows.Length = 0 Then
Console.WriteLine("No match found.")
Else
Dim myDRV As DataRowView
For Each myDRV In foundRows
Console.WriteLine("{0}, {1}", _
myDRV("CompanyName").ToString(), myDRV("ContactName").ToString())
Next
End If
DataView custView = new DataView(custDS.Tables["Customers"], "",
"CompanyName, ContactName",
DataViewRowState.CurrentRows);
DataRowView[] foundRows =
custView.FindRows(new object[] {"The Cracker Box", "Liu Wong"});
if (foundRows.Length == 0)
Console.WriteLine("No match found.");
else
foreach (DataRowView myDRV in foundRows)
Console.WriteLine("{0}, {1}", myDRV["CompanyName"].ToString(),
myDRV["ContactName"].ToString());