Hi Telerik,
If a grid has detail table, the client grid command is set, the ItemCommand of the detail table will get the incorrect GridDataItem, can you take a look?
<ClientSettings>
<ClientEvents OnCommand="GridCommand" />
</ClientSettings>
protected void RadGrid1_ItemCommand (object sender, GridCommandEventArgs e)
{
if (e.CommandName == "RemoveLogin")
{
GridDataItem item = (GridDataItem)e.Item;
int deleteKey = Convert.ToInt32 (item["KeyID"].Text);
Label1.Text = item["KeyID"].Text + "<br/>" + item["LoginID"].Text;
//RadGrid1.Rebind ();
}
}
In following example, click "Remove" button on the row other than the first row in the detail table will get the wrong GridDataItem, the item of first row is always returned.
If the client event is disabled, the ItemCommand will work correctly.
Default.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="Default" %>
<head runat="server">
<title></title>
<telerik:RadStyleSheetManager ID="RadStyleSheetManager1" runat="server" />
</head>
<body>
<form id="form1" runat="server">
<telerik:RadScriptManager ID="RadScriptManager1" runat="server">
<Scripts>
<asp:ScriptReference Assembly="Telerik.Web.UI" Name="Telerik.Web.UI.Common.Core.js" />
<asp:ScriptReference Assembly="Telerik.Web.UI" Name="Telerik.Web.UI.Common.jQuery.js" />
<asp:ScriptReference Assembly="Telerik.Web.UI" Name="Telerik.Web.UI.Common.jQueryInclude.js" />
</Scripts>
</telerik:RadScriptManager>
<script type="text/javascript">
function GridCommand(sender, eventArgs)
{
}
</script>
<telerik:RadAjaxManager ID="RadAjaxManager1" runat="server">
</telerik:RadAjaxManager>
<div>
<telerik:RadGrid ID="RadGrid1" AutoGenerateColumns="False" runat="server" AllowSorting="True" CellSpacing="0" GridLines="None" AllowPaging="True" PageSize="20"
OnDetailTableDataBind="RadGrid1_DetailTableDataBind" OnItemCommand="RadGrid1_ItemCommand" OnNeedDataSource="RadGrid1_NeedDataSource">
<SortingSettings EnableSkinSortStyles="false" />
<ClientSettings>
<Selecting AllowRowSelect="True" />
<ClientEvents OnCommand="GridCommand" />
</ClientSettings>
<GroupingSettings CaseSensitive="false" />
<MasterTableView DataKeyNames="MemberID" ClientDataKeyNames="MemberID" AllowFilteringByColumn="True">
<DetailTables>
<telerik:GridTableView Name="KeyDetail" Width="100%">
<Columns>
<telerik:GridBoundColumn DataField="KeyID" ReadOnly="true" HeaderText="Login ID" UniqueName="KeyID" AllowFiltering="false" />
<telerik:GridBoundColumn DataField="LoginID" ReadOnly="true" HeaderText="Login" UniqueName="LoginID" AllowFiltering="false" />
<telerik:GridBoundColumn DataField="LoginSID" ReadOnly="true" HeaderText="Encrypted SID" UniqueName="LoginSID" AllowFiltering="false" />
<telerik:GridButtonColumn UniqueName="RemoveLogin" ButtonType="PushButton" HeaderText="" CommandName="RemoveLogin" Text="Remove" />
</Columns>
</telerik:GridTableView>
</DetailTables>
<Columns>
<telerik:GridBoundColumn DataField="FirstName" ReadOnly="true" HeaderText="First Name" UniqueName="FirstName" ShowFilterIcon="false" AutoPostBackOnFilter="true"
CurrentFilterFunction="Contains" />
<telerik:GridBoundColumn DataField="LastName" ReadOnly="true" HeaderText="Last Name" UniqueName="LastName" ShowFilterIcon="false" AutoPostBackOnFilter="true"
CurrentFilterFunction="Contains" />
<telerik:GridButtonColumn UniqueName="EditLink" ButtonType="PushButton" HeaderText="Edit User" CommandName="EditUser" Text="Edit" />
<telerik:GridButtonColumn UniqueName="ViewLog" ButtonType="PushButton" HeaderText="View Log" CommandName="ViewLog" Text="Log" />
</Columns>
<PagerStyle Mode="NextPrevNumericAndAdvanced" AlwaysVisible="true" />
<SortExpressions>
<telerik:GridSortExpression FieldName="userActive" SortOrder="Descending" />
</SortExpressions>
</MasterTableView>
</telerik:RadGrid>
<p>
<asp:Label ID="Label1" runat="server" Text="Message"></asp:Label>
</p>
</div>
</form>
</body>
</html>
Default.aspx.cs
using System;
using System.Data;
using Telerik.Web.UI;
public partial class Default : System.Web.UI.Page
{
protected void Page_Load (object sender, EventArgs e)
{
if (!IsPostBack)
{
DataTable masterTable = new DataTable ();
masterTable.Columns.Add (new DataColumn ("FirstName", Type.GetType ("System.String")));
masterTable.Columns.Add (new DataColumn ("LastName", Type.GetType ("System.String")));
masterTable.Columns.Add (new DataColumn ("MemberID", Type.GetType ("System.Int32")));
masterTable.Columns.Add (new DataColumn ("userActive", Type.GetType ("System.Boolean")));
masterTable.Rows.Add ("John", "Doe", 1, true);
masterTable.Rows.Add ("Sam", "Smith", 2, false);
masterTable.Rows.Add ("Mary", "Doe", 3, true);
DataTable detailTable = new DataTable ();
detailTable.Columns.Add (new DataColumn ("MemberID", Type.GetType ("System.Int32")));
detailTable.Columns.Add (new DataColumn ("KeyID", Type.GetType ("System.String")));
detailTable.Columns.Add (new DataColumn ("LoginID", Type.GetType ("System.String")));
detailTable.Columns.Add (new DataColumn ("LoginSID", Type.GetType ("System.String")));
detailTable.Rows.Add (1, "1001", "Office\\JD", "JohnDoeSID");
detailTable.Rows.Add (1, "1002", "Home\\JD", "JohnDoeSID2");
detailTable.Rows.Add (1, "1003", "Home\\JD2", "JohnDoeSID3");
detailTable.Rows.Add (2, "2001", "Office\\SS", "SamSmithSID");
detailTable.Rows.Add (2, "2002", "Home\\SS", "SamSmithSID2");
ViewState["master"] = masterTable;
ViewState["detail"] = detailTable;
}
}
protected void RadGrid1_NeedDataSource (object sender, GridNeedDataSourceEventArgs e)
{
RadGrid1.DataSource = (DataTable)ViewState["master"];
}
protected void RadGrid1_DetailTableDataBind (object sender, GridDetailTableDataBindEventArgs e)
{
GridDataItem dataItem = (GridDataItem)e.DetailTableView.ParentItem;
if (e.DetailTableView.Name == "KeyDetail")
{
string memberID = dataItem.GetDataKeyValue ("MemberID").ToString ();
DataTable detailTable =(DataTable)ViewState["detail"];
e.DetailTableView.DataSource = detailTable.Select ("MemberID =" + memberID);
}
}
protected void RadGrid1_ItemCommand (object sender, GridCommandEventArgs e)
{
if (e.CommandName == "RemoveLogin")
{
GridDataItem item = (GridDataItem)e.Item;
int deleteKey = Convert.ToInt32 (item["KeyID"].Text);
Label1.Text = item["KeyID"].Text + "<br/>" + item["LoginID"].Text;
//RadGrid1.Rebind ();
}
}
}