2012-04-04 38 views
1

我正在使用Telerik RadGrid控件顯示從數據庫中提取的數據。GridView/RadGrid - 從數據源提取原始類型的對象

的標記看起來如下:

<MasterTableView runat="server" AllowMultiColumnSorting="false" DataKeyNames="PersonNumber" AllowNaturalSort="false"> 
      <Columns> 
       <telerik:GridClientSelectColumn UniqueName="RowSelectColumn" HeaderText="&nbsp;" 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,映射到一個數據行(某些屬性沒有在網格示出)。我需要它,所以當用戶選擇一個或多個行時,我可以檢索行代表/綁定到的原始對象。我知道關鍵是從數據源中提取,但是如何將一行映射到源代碼中的等效數據?

回答

1

可以使用DataKeyNames來包含網格中不存在的值,通過設置這些值來檢索客戶端或服務器端的行時可以訪問其他列,最常見的用法是使用2個函數SelectedIndexChanged(服務器端)和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。