1

データベースから取得したデータを表示するために Telerik 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 などのクラスがあります (一部のプロパティはグリッドに表示されません)。ユーザーが行を選択したときに、行が表す/バインドされている元のオブジェクトを取得できるようにする必要があります。データ ソースから抽出することが重要であることはわかっていますが、行をソース内の同等のデータにマップするにはどうすればよいでしょうか。

4

1 に答える 1

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 に追加することをお勧めします。

于 2012-04-05T13:39:21.353 に答える