DataKey 类用于表示数据绑定控件中某个记录的主键。记录的主键可以由数据源中的一个或多个字段组成。尽管 DataKey 类不是集合,但它可以存储多个键字段值。当调用 DataKey 类的某个构造函数
时,将填充键字段值。可以通过以下方法从 DataKey 对象中检索键字段值:
使用 DataKey.Item(Int32) 属性检索 DataKey 对象中特定索引位置的键字段值。
使用 DataKey.Item(String) 属性检索特定字段的键字段值。
使用 Value 属性检索 DataKey 对象中索引 0 位置的键字段值。当主键只包含一个字段时,此属性常用作检索记录键值的快捷方式。
使用 Values 属性创建可用于循环访问键字段值的 IOrderedDictionary 对象。
通常,当设置了数据绑定控件的 DataKeyNames 属性时,控件自动生成 DataKey 对象。DataKey 对象包含 DataKeyNames 属性中指定的一个或多个键字段的值。
一次显示一个记录的数据绑定控件(如 DetailsView 或 FormView)通常在它的 DataKey 属性中存储所显示的当前记录的 DataKey 对象。
一次显示多个记录的数据绑定控件(如 GridView) 通常在DataKeys 属性中存储DataKeyArray集合,该集合存储它的每个记录的 DataKey 对象。
正常情况下,DataKeys 属性用于检索 GridView 控件中特定数据行的 DataKey 对象。但是,如果您只需要检索当前选中行的 DataKey 对象,则可以简单地使用 SelectedDataKey 属性作为一种快捷方式。 这和从 DataKeys 集合检索位于指定索引(由 SelectedIndex 属性指定)位置的 DataKey 对象一样。还可以使用 SelectedValue 属性直接检索当前选中行的数据键值。
下面的代码示例演示如何使用 SelectedDataKey 属性来确定 GridView 控件中选中行的数据键值。
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
<script runat="server">
void CustomersGridView_SelectedIndexChanged(Object sender, EventArgs e)
{
// Display the primary key value of the selected row.
Message.Text = "The primary key value of the selected row is " +
CustomersGridView.SelectedDataKey.Value.ToString() + ".";
}
</script>
<html>
<body>
<form runat="server">
<h3>GridView SelectedDataKey Example</h3>
<asp:label id="Message"
forecolor="Red"
runat="server"/>
<br/><br/>
<asp:gridview id="CustomersGridView"
datasourceid="CustomersSource"
allowpaging="true"
autogeneratecolumns="true"
autogenerateselectbutton="true"
datakeynames="CustomerID"
onselectedindexchanged="CustomersGridView_SelectedIndexChanged"
runat="server">
<selectedrowstyle backcolor="LightBlue"
forecolor="DarkBlue"/>
</asp:gridview>
<!-- This example uses Microsoft SQL Server and connects -->
<!-- to the Northwind sample database. Use an ASP.NET -->
<!-- expression to retrieve the connection string value -->
<!-- from the Web.config file. -->
<asp:sqldatasource id="CustomersSource"
selectcommand="Select [CustomerID], [CompanyName], [Address], [City], [PostalCode], [Country] From [Customers]"
connectionstring="<%$ ConnectionStrings:NorthWindConnectionString%>"
runat="server"/>
</form></body></html>
下面的代码示例演示如何在主/从方案中将第二个键字段作为参数使用。使用 GridView 控件显示 Northwind 数据库的 Order Details 表中的记录。在 GridView 控件中选择某一记录时,将在
DetailsView 控件中显示来自 Products 表的产品详细信息。ProductID 是 GridView 控件中的第二个键名称。若要访问第二个键,请将 GridView1.SelectedDataKey[1] 的值用作 DetailsView 控件的
SqlDataSource 控件的 ControlParameter 对象的 PropertyName。
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
<!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>Selecting Data Key Values</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:SqlDataSource
ID="SqlDataSource1"
runat="server"
ConnectionString="<%$ ConnectionStrings:NorthWindConnectionString%>"
ProviderName="System.Data.SqlClient"
SelectCommand="SELECT * FROM [Order Details]">
</asp:SqlDataSource>
<asp:SqlDataSource
ID="SqlDataSource2"
runat="server"
ConnectionString="<%$ ConnectionStrings:NorthWindConnectionString%>"
ProviderName="System.Data.SqlClient"
SelectCommand="SELECT * FROM [Products]WHERE [ProductID] = @productid">
<SelectParameters>
<asp:ControlParameter
Name="productid"
ControlID="GridView1"
PropertyName="SelectedDataKey[1]" />
</SelectParameters>
</asp:SqlDataSource>
</div>
<asp:GridView
ID="GridView1"
runat="server"
AllowPaging="True"
AutoGenerateColumns="False"
DataKeyNames="OrderID,ProductID" DataSourceID="SqlDataSource1">
<Columns>
<asp:CommandField ShowSelectButton="True" />
<asp:BoundField DataField="OrderID" HeaderText="OrderID" ReadOnly="True"/>
<asp:BoundField DataField="ProductID" HeaderText="ProductID" ReadOnly="True" />
<asp:BoundField DataField="UnitPrice" HeaderText="UnitPrice" />
<asp:BoundField DataField="Quantity" HeaderText="Quantity" />
<asp:BoundField DataField="Discount" HeaderText="Discount" />
</Columns>
</asp:GridView>
<br />
<asp:DetailsView
ID="DetailsView1"
runat="server"
AutoGenerateRows="False"
DataKeyNames="ProductID"
DataSourceID="SqlDataSource2"
Height="50px" Width="125px">
<Fields>
<asp:BoundField
DataField="ProductID"
HeaderText="ProductID"
InsertVisible="False"
ReadOnly="True" />
<asp:BoundField DataField="ProductName" HeaderText="ProductName"/>
<asp:BoundField DataField="SupplierID" HeaderText="SupplierID"/>
<asp:BoundField DataField="CategoryID" HeaderText="CategoryID" />
<asp:BoundField DataField="QuantityPerUnit" HeaderText="QuantityPerUnit" />
<asp:BoundField DataField="UnitPrice" HeaderText="UnitPrice" />
<asp:BoundField DataField="UnitsInStock" HeaderText="UnitsInStock" />
<asp:BoundField DataField="UnitsOnOrder" HeaderText="UnitsOnOrder" />
<asp:BoundField DataField="ReorderLevel" HeaderText="ReorderLevel" />
<asp:CheckBoxField DataField="Discontinued" HeaderText="Discontinued" />
</Fields>
</asp:DetailsView>
</form>
</body>
</html>
【转自】http://www.cnblogs.com/Fskjb/archive/2010/05/02/1725887.html