我正在使用Telerik RadGrid控件来显示从数据库中提取的数据。
标记如下:
<MasterTableView runat="server" AllowMultiColumnSorting="false" DataKeyNames="PersonNumber" AllowNaturalSort="false">
<Columns>
<telerik:GridClientSelectColumn UniqueName="RowSelectColumn" HeaderText=" " Resizable="false" Reorderable="false">
<HeaderStyle HorizontalAlign="Center" Width="18px" />
<ItemStyle HorizontalAlign="Center" Width="18px" />
</telerik:GridClientSelectColumn>
<telerik:GridBoundColumn HeaderText="Name" UniqueName="Name" DataField="Name" SortExpression="Name" HtmlEncode="false">
<HeaderStyle HorizontalAlign="Center" Width="250px" />
<ItemStyle HorizontalAlign="Left" Width="250px" />
</telerik:GridBoundColumn>
<telerik:GridBoundColumn HeaderText="E-mail Address" UniqueName="EmailAddress" DataField="EmailAddress" SortExpression="EmailAddress" HtmlEncode="false">
<HeaderStyle HorizontalAlign="Center" Width="200px" />
<ItemStyle HorizontalAlign="Left" Width="200px" />
</telerik:GridBoundColumn>
<telerik:GridBoundColumn HeaderText="Invite Status" UniqueName="InviteResult" DataField="InviteResult" SortExpression="InviteResult">
<HeaderStyle HorizontalAlign="Center" />
<ItemStyle HorizontalAlign="Left"/>
</telerik:GridBoundColumn>
</Columns>
</MasterTableView>
我有一个类,比如MyObject,它映射到数据行(某些属性未显示在网格中)。我需要它,所以当用户选择一行时,我能够检索该行代表/绑定的原始对象。我知道关键是从数据源中提取,但是如何将行映射到源中的等效数据呢?
答案 0 :(得分:1)
您可以使用DataKeyNames包含网格中不存在的值,通过在客户端或服务器端检索行时设置这些值,您可以访问其他列,最常见的用途是使用2个函数SelectedIndexChanged(Server -Side)和OnRowSelected(客户端)。您可以将额外的列存储在datakeynames中,也可以使用主键和一些linq从数据源中检索相同的行
<telerik:RadGrid ID="RadGrid1" runat="server" AutoGenerateColumns="false"
OnSelectedIndexChanged="RadGrid1_SelectedIndexChanged">
<MasterTableView DataKeyNames="Id,HiddenVal1,HiddenVal2" ClientDataKeyNames="Id,HiddenVal1,HiddenVal2,clientsideSpecialId">
<Columns>
<telerik:GridButtonColumn CommandName="Select" Text="Select" UniqueName="SelectColumn" />
<telerik:GridBoundColumn UniqueName="ContactName" HeaderText="Contact name" DataField="ContactName" />
<telerik:GridBoundColumn UniqueName="ContactTitle" HeaderText="Contact title" DataField="ContactTitle" />
</Columns>
</MasterTableView>
<ClientSettings>
<ClientEvents OnRowSelected="RowSelected"/>
</ClientSettings>
</telerik:RadGrid>
检索所选索引的服务器端dataKeyName值已更改:
protected void RadGrid1_SelectedIndexChanged(object sender, EventArgs e)
{
if (RadGrid1.SelectedItems == null || RadGrid1.SelectedItems.Count == 0)
return;
var dataItem = RadGrid1.SelectedItems[0] as GridDataItem;
if (dataItem != null)
{
var myId = dataItem.GetDataKeyValue("id").ToString();
myTable = getDataSource();//stored in mem or retrieve from db again
//linq or whatever you want to retrieve that row (if you need to go back to your datasource
var name = from r in MyTable
where r.ID == myId
select r.Name;
}
}
如果可能的话,我建议你在dataKeyNames中添加你需要的任何列。