This is a migrated thread and some comments may be shown as answers.

Parent table update after updating detail table in hierarchy radgrid

7 Answers 490 Views
Grid
This is a migrated thread and some comments may be shown as answers.
Sentha
Top achievements
Rank 1
Sentha asked on 16 Apr 2009, 05:06 PM

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="&amp;nbsp;"

 HeaderText="Name" UniqueName="PersonName">

 <HeaderStyle Height="20px" />

 </telerik:GridBoundColumn>

 <telerik:GridBoundColumn DataField="Amount" EmptyDataText="&amp;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.

 

7 Answers, 1 is accepted

Sort by
0
Accepted
Yavor
Telerik team
answered on 22 Apr 2009, 06:27 AM
Hi Sentha,

One possible way to work-around this exception is to move it in the PreRender event handler. For example, you can set a flag in the ItemCommand event handler of the control, and if the flag is true, rebind the grid in the PreRender event handler, to make sure it reflects the latest data.
Give this suggestion a try and let me know how it goes.

Greetings,
Yavor
the Telerik team

Instantly find answers to your questions on the new Telerik Support Portal.
Check out the tips for optimizing your support resource searches.
0
Sentha
Top achievements
Rank 1
answered on 22 Apr 2009, 02:10 PM

Hi Yavor,

 

Thanks for your reply. I tried your solution and it worked.

Thanks,
Sentha.

0
VENGATACHALAM
Top achievements
Rank 1
answered on 21 Nov 2013, 06:49 AM
Hi 

  It is working.Thanks
0
Peter
Top achievements
Rank 1
answered on 15 May 2014, 01:58 AM
I tried this option, but the value didn't refresh (still shows old value):

 protected void rgAwards_PreRender(object sender, EventArgs e)
        {
            if (rebind)
            {
                rgAwards.MasterTableView.DetailTables[1].Rebind();
            }
        }
0
Peter
Top achievements
Rank 1
answered on 15 May 2014, 02:00 AM
If I rebind the whole grid, the user loses where they were in the grid. 
0
Peter
Top achievements
Rank 1
answered on 15 May 2014, 02:01 AM
Seems I might something a whole lot more complicated: http://www.telerik.com/forums/refresh-parent-grid-when-detail-grid-updates
0
Kostadin
Telerik team
answered on 19 May 2014, 11:46 AM
Hello Peter,

You could persist the previously expanded items after the grid is rebound by using the RetainExpandStateOnRebind property.
<telerik:RadGrid ID="RadGrid1" RetainExpandStateOnRebind="true" .....></telerik:RadGrid>

Regards,
Kostadin
Telerik
 

Check out the Telerik Platform - the only platform that combines a rich set of UI tools with powerful cloud services to develop web, hybrid and native mobile apps.

 
Tags
Grid
Asked by
Sentha
Top achievements
Rank 1
Answers by
Yavor
Telerik team
Sentha
Top achievements
Rank 1
VENGATACHALAM
Top achievements
Rank 1
Peter
Top achievements
Rank 1
Kostadin
Telerik team
Share this question
or