Hi
I’m using hierarchy RadGrid for my application, in which I’m using the master/parent table to show the total amount of the detail table row amounts. So when the user updates the amount in detail table, I have to update the total amount in the master table. But the master table doesn’t refresh automatically after the detail table is updated. When I try to rebind the grid after I update the detail table, it throws an exception saying “OrderDetailsID is neither a DataColumn nor a DataRelation for table Table.” I’m using ItemCommand method for updating detail table. Please help me to solve this problem.
Here is the Code:
protected void gridOrders_ItemCommand(object source, GridCommandEventArgs e)
{
lblStatus.Text = String.Empty;
int OrderID;
int OrderDetailsID;
String ItemName;
Double Amount;
switch (e.CommandName.ToUpper())
{
case "UPDATE":
if (e.Item.OwnerTableView.Name == "OrderDetails")
{
GridEditableItem editedItem = e.Item as GridEditableItem;
OrderDetailsID = int.Parse(editedItem.OwnerTableView.DataKeyValues[editedItem.ItemIndex]["OrderDetailsID"].ToString());
OrderID = int.Parse(editedItem.OwnerTableView.DataKeyValues[editedItem.ItemIndex]["OrderID"].ToString());
ItemName = (editedItem[
"ItemName"].Controls[1] as RadTextBox).Text;
Amount = Double.Parse((editedItem["Amount"].Controls[1] as RadNumericTextBox).Text.ToString());
try
{
//Update Order Details
String cmdText = "UPDATE [OrderDetails] SET ItemName = '"+ ItemName +"', Amount = " + Amount + " WHERE OrderDetailsID = " + OrderDetailsID;
Database db = DatabaseFactory.CreateDatabase();
DbCommand dbCmd = db.GetSqlStringCommand(cmdText);
db.ExecuteNonQuery(dbCmd);
//Update Orders
UpdateOrders(OrderID);
gridOrders.MasterTableView.Rebind(); ---------------------------------------------->> This line causes the exception.
}
catch (Exception ex)
{
lblStatus.Text = ex.Message;
}
}
break;
}
}
protected void gridOrders_NeedDataSource1(object source, GridNeedDataSourceEventArgs e)
{
try
{
string cmdText = @"SELECT OrderID, PersonName, Amount FROM [Order]";
Database db = DatabaseFactory.CreateDatabase();
DbCommand dbCmd = db.GetSqlStringCommand(cmdText);
DataSet orderDataSet = db.ExecuteDataSet(dbCmd); gridOrders.DataSource = (DataTable)orderDataSet.Tables[0];
}
catch (Exception ex)
{
lblStatus.Text = ex.Message;
}
}
protected void gridOrders_DetailTableDataBind(object source, GridDetailTableDataBindEventArgs e)
{
GridDataItem dataItem = (GridDataItem)e.DetailTableView.ParentItem;
string OrderID = dataItem.GetDataKeyValue("OrderID").ToString();
if (e.DetailTableView.Name == "OrderDetails")
{
try
{
string cmdText = @"SELECT * FROM OrderDetails WHERE OrderID = " + OrderID;
Database db = DatabaseFactory.CreateDatabase();
DbCommand dbCmd = db.GetSqlStringCommand(cmdText);
DataSet detailDataSet = db.ExecuteDataSet(dbCmd);
e.DetailTableView.DataSource = (DataTable)detailDataSet.Tables[0];
}
catch (Exception ex)
{
lblStatus.Text = ex.Message;
}
}
}
<telerik:RadGrid ID="gridOrders" runat="server" AutoGenerateColumns="False" GridLines="None"
Width="600px" onitemcommand="gridOrders_ItemCommand" onneeddatasource="gridOrders_NeedDataSource1" ShowFooter="true"
ondetailtabledatabind="gridOrders_DetailTableDataBind" >
<MasterTableView DataKeyNames="OrderID" Width="100%" Name="Orders">
<DetailTables>
<telerik:GridTableView DataKeyNames="OrderDetailsID,OrderID" Width="100%" runat="server"
Name="OrderDetails" CommandItemDisplay="Top">
<ParentTableRelation>
<telerik:GridRelationFields DetailKeyField="OrderID" MasterKeyField="OrderID" />
</ParentTableRelation>
<Columns>
<telerik:GridEditCommandColumn ButtonType="ImageButton">
</telerik:GridEditCommandColumn>
<telerik:GridTemplateColumn HeaderText="Item Name" UniqueName="ItemName">
<ItemTemplate>
<asp:Label ID="lblItemName" runat="server" Text='<%# Eval("ItemName") %>'></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<telerik:RadTextBox ID="tbItemName" runat="server" Text='<%# Bind("ItemName") %>'
Width="135px" >
</telerik:RadTextBox>
<span style="color: Red">*</span>
<asp:RequiredFieldValidator ID="rfvItemName" runat="server"
ControlToValidate="tbItemName" ErrorMessage="Item Name is required!">
</asp:RequiredFieldValidator>
</EditItemTemplate>
</telerik:GridTemplateColumn>
<telerik:GridTemplateColumn HeaderText="Amount" UniqueName="Amount" >
<ItemTemplate>
<asp:Label ID="lblAmount" runat="server" Text='<%# Eval("Amount", "{0:C}") %>'></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<br />
<telerik:RadNumericTextBox ID="tbAmount" Runat="server" Text='<%# Bind("Amount") %>'
MinValue="0" Width="135px" NumberFormat-AllowRounding="True" NumberFormat-DecimalDigits="2">
</telerik:RadNumericTextBox>
<span style="color: Red">*</span>
<asp:RequiredFieldValidator ID="rfvAmount" runat="server"
ControlToValidate="tbAmount" ErrorMessage="Amount is required!">
</asp:RequiredFieldValidator>
</EditItemTemplate>
</telerik:GridTemplateColumn>
<telerik:GridButtonColumn CommandName="Delete" Text="Delete" ButtonType="ImageButton"
ConfirmText="Are you sure you want to delete this record?" ConfirmTitle="Confirm Delete" UniqueName="column">
</telerik:GridButtonColumn>
</Columns>
</telerik:GridTableView>
</DetailTables>
<Columns>
<telerik:GridBoundColumn DataField="PersonName" EmptyDataText="&nbsp;"
HeaderText="Name" UniqueName="PersonName">
<HeaderStyle Height="20px" />
</telerik:GridBoundColumn>
<telerik:GridBoundColumn DataField="Amount" EmptyDataText="&nbsp;" DataFormatString="{0:C}" Aggregate="Sum"
HeaderText="Amount" UniqueName="Amount">
<HeaderStyle Height="20px" />
</telerik:GridBoundColumn>
</Columns>
</MasterTableView>
<HeaderStyle HorizontalAlign="Center" />
<FilterMenu EnableTheming="True">
<CollapseAnimation Duration="200" Type="OutQuint" />
</FilterMenu>
</telerik:RadGrid>
Thanks,
Sentha.