データ ソース コントロールによるデータのフィルタ処理
更新 : 2007 年 11 月
データ ソース コントロールは、アプリケーションに簡単に高度な機能を追加するための一連のデータ サービスを提供します。これには、指定した検索条件に基づいてデータをフィルタする機能も含まれます。フィルタ処理は、キャッシュされたデータを使用する場合に特に便利です。これは、クエリを再実行したり、データを読み出すためにメソッドを呼び出さずに検索機能を提供できるからです。
データをフィルタするには、データ ソース コントロールを次のような方法で構成する必要があります。
SqlDataSource コントロールまたは AccessDataSource コントロールでは、DataSourceMode プロパティを DataSet に設定する必要があります。
ObjectDataSource コントロールでは、基になるソース オブジェクトは DataSet オブジェクトまたは DataTable オブジェクトを返す必要があります。
XmlDataSource コントロールを使用する場合は、XPath クエリを使用してデータをフィルタできます。詳細については、「XmlDataSource コントロールによるデータのフィルタ処理」を参照してください。
フィルタ式の設定
ObjectDataSource、SqlDataSource、または AccessDataSource の各コントロールが返すデータに適用するフィルタを指定するには、データ ソース コントロールの FilterExpression プロパティを設定します。フィルタ式の構文は、DataColumn クラスの Expression プロパティの構文に基づきます。フィルタ式は、データ ソース コントロールの Select メソッドが呼び出すときに適用されます。
フィルタ パラメータの指定
ObjectDataSource、SqlDataSource、または AccessDataSource の各コントロールには、パラメータ化されたフィルタ式を指定できます。これによって、FilterExpression プロパティを設定するコードを明示的に記述せずに、実行時にフィルタ値を指定できます。フィルタ式のパラメータは、データ ソース コントロールの FilterParameters コレクションを使用して指定します。このパラメータによって、コントロール、QueryString オブジェクト、セッション状態、ユーザー プロファイル プロパティなどからデータを取得できます。FilterParameters コレクションで使用できるパラメータの種類については、「データ ソース コントロールとパラメータの使用」を参照してください。
フィルタ式では、データ ソース コントロールの FilterParameters コレクションの項目に対応するプレースホルダを作成します。プレースホルダには連番が付けられ、0 がコレクションの最初のパラメータを表します。フィルタ式のプレースホルダは、次の例のように、フィルタ パラメータの番号を '{' 文字と '}' 文字で囲んで指定します。
Country = '{0}' AND LastName LIKE '{1}'
セキュリティに関するメモ : |
---|
FilterParameters コレクションの値はエンコードなしで FilterExpression 文字列に置き換えられるため、フィルタを適用する前に、すべてのフィルタ パラメータの値を検証する必要があります。データ ソース コントロールの Filtering イベントを使用すると、フィルタを適用する前にフィルタ パラメータの値にアクセスして検証できます。 |
フィルタ パラメータを含む EmployeeDetailsSqlDataSource という SqlDataSource コントロールの例を次に示します。FilterExpression プロパティが使用するパラメータ値は、ページの他の場所のプロパティ値によって実行時に設定されます。
<%@ Page language="VB" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Northwind Employees</title>
</head>
<body>
<form id="form1" runat="server">
<h3>Northwind Employees</h3>
<table cellspacing="10">
<tr>
<td valign="top">
<table border="0">
<tr>
<td valign="top">Country</td>
<td><asp:DropDownList runat="server" id="CountryListBox" AppendDataBoundItems="True"
DataSourceID="CountrySqlDataSource"
DataTextField="Country" DataValueField="Country" >
<asp:ListItem Selected="True" Value="" >(Show All)</asp:ListItem>
</asp:DropDownList>
</td>
</tr>
<tr>
<td>Last Name</td>
<td><asp:TextBox runat="server" id="LastNameTextBox" Text="*" /></td>
</tr>
<tr>
<td></td>
<td><asp:Button runat="server" id="FilterButton" Text="Filter Results" /></td>
</tr>
</table>
</td>
<td valign="top">
<asp:GridView ID="EmployeesGridView"
DataSourceID="EmployeeDetailsSqlDataSource"
AutoGenerateColumns="false"
AllowSorting="True"
DataKeyNames="EmployeeID"
Gridlines="Both"
RunAt="server">
<HeaderStyle backcolor="Navy"
forecolor="White"/>
<RowStyle backcolor="White"/>
<AlternatingRowStyle backcolor="LightGray"/>
<EditRowStyle backcolor="LightCyan"/>
<Columns>
<asp:BoundField DataField="EmployeeID" HeaderText="Employee ID" ReadOnly="true"/>
<asp:BoundField DataField="FirstName" HeaderText="First Name"/>
<asp:BoundField DataField="LastName" HeaderText="Last Name"/>
<asp:BoundField DataField="Country" HeaderText="Country"/>
</Columns>
</asp:GridView>
</td>
</tr>
</table>
<asp:SqlDataSource ID="CountrySqlDataSource"
SelectCommand="SELECT DISTINCT Country FROM Employees"
EnableCaching="True"
CacheDuration="60"
ConnectionString="<%$ ConnectionStrings:NorthwindConnection %>"
RunAt="server" />
<asp:SqlDataSource ID="EmployeeDetailsSqlDataSource"
SelectCommand="SELECT EmployeeID, LastName, FirstName, Country FROM Employees"
EnableCaching="True"
CacheDuration="60"
ConnectionString="<%$ ConnectionStrings:NorthwindConnection %>"
FilterExpression="Country LIKE '{0}' AND LastName LIKE '{1}'"
RunAt="server">
<FilterParameters>
<asp:ControlParameter ControlID="CountryListBox" PropertyName="SelectedValue" />
<asp:ControlParameter ControlID="LastNameTextBox" PropertyName="Text" />
</FilterParameters>
</asp:SqlDataSource>
</form>
</body>
</html>
<%@ Page language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Northwind Employees</title>
</head>
<body>
<form id="form1" runat="server">
<h3>Northwind Employees</h3>
<table cellspacing="10">
<tr>
<td valign="top">
<table border="0">
<tr>
<td valign="top">Country</td>
<td><asp:DropDownList runat="server" id="CountryListBox" AppendDataBoundItems="True"
DataSourceID="CountrySqlDataSource"
DataTextField="Country" DataValueField="Country" >
<asp:ListItem Selected="True" Value="" >(Show All)</asp:ListItem>
</asp:DropDownList>
</td>
</tr>
<tr>
<td>Last Name</td>
<td><asp:TextBox runat="server" id="LastNameTextBox" Text="*" /></td>
</tr>
<tr>
<td></td>
<td><asp:Button runat="server" id="FilterButton" Text="Filter Results" /></td>
</tr>
</table>
</td>
<td valign="top">
<asp:GridView ID="EmployeesGridView"
DataSourceID="EmployeeDetailsSqlDataSource"
AutoGenerateColumns="false"
AllowSorting="true"
DataKeyNames="EmployeeID"
Gridlines="Both"
RunAt="server">
<HeaderStyle backcolor="Navy"
forecolor="White"/>
<RowStyle backcolor="White"/>
<AlternatingRowStyle backcolor="LightGray"/>
<EditRowStyle backcolor="LightCyan"/>
<Columns>
<asp:BoundField DataField="EmployeeID" HeaderText="Employee ID" ReadOnly="true"/>
<asp:BoundField DataField="FirstName" HeaderText="First Name"/>
<asp:BoundField DataField="LastName" HeaderText="Last Name"/>
<asp:BoundField DataField="Country" HeaderText="Country"/>
</Columns>
</asp:GridView>
</td>
</tr>
</table>
<asp:SqlDataSource ID="CountrySqlDataSource"
SelectCommand="SELECT DISTINCT Country FROM Employees"
EnableCaching="True"
CacheDuration="60"
ConnectionString="<%$ ConnectionStrings:NorthwindConnection %>"
RunAt="server" />
<asp:SqlDataSource ID="EmployeeDetailsSqlDataSource"
SelectCommand="SELECT EmployeeID, LastName, FirstName, Country FROM Employees"
EnableCaching="True"
CacheDuration="60"
ConnectionString="<%$ ConnectionStrings:NorthwindConnection %>"
FilterExpression="Country LIKE '{0}' AND LastName LIKE '{1}'"
RunAt="server">
<FilterParameters>
<asp:ControlParameter ControlID="CountryListBox" PropertyName="SelectedValue" />
<asp:ControlParameter ControlID="LastNameTextBox" PropertyName="Text" />
</FilterParameters>
</asp:SqlDataSource>
</form>
</body>
</html>