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

Localized detail table headers lose value when other detail is expanded

3 Answers 132 Views
Grid
This is a migrated thread and some comments may be shown as answers.
David Louth
Top achievements
Rank 1
David Louth asked on 07 Jul 2010, 12:18 AM

I have a grid with DetailTables which are populated using OnDetailTableDataBind. The headers of the detail table are localized server side because the data is different depending upon the parent. When a row is expanded, the details display with the correct header text. The problem is when I expande another row. That's rows header text displays correctly but the first detail table's header text is now empty for each column. I've tried a few ways to set the text but neither hold their values when an additional row is expanded.

<telerik:RadGrid ID="rgInvoices" runat="server" GridLines="None" AllowPaging="True" 
    AllowMultiRowSelection="true" ShowStatusBar="true" AllowSorting="True" AutoGenerateColumns="False" 
    GroupingEnabled="False" Skin="CentreTelerikNoSelectStyle" EnableEmbeddedSkins="false" 
    OnNeedDataSource="rgInvoices_NeedDataSource" PageSize="10" OnItemCreated="rgInvoices_ItemCreated" 
    OnItemDataBound="rgInvoices_ItemDataBound" OnDetailTableDataBind="rgInvoices_DetailTableDataBind" 
    HeaderStyle-Font-Bold="true">  
    <MasterTableView ...> 
        <Columns> 
        ...  
</Columns> 
        <DetailTables> 
            <telerik:GridTableView Width="100%" AutoGenerateColumns="false">  
                <Columns> 
                    <telerik:GridBoundColumn DataField="Field2"></telerik:GridBoundColumn> 
                    <telerik:GridBoundColumn DataField="Field3"></telerik:GridBoundColumn> 
                    <telerik:GridBoundColumn DataField="Field4"></telerik:GridBoundColumn> 
                    <telerik:GridBoundColumn DataField="Field5"></telerik:GridBoundColumn> 
                    <telerik:GridBoundColumn DataField="Field6"></telerik:GridBoundColumn> 
                    <telerik:GridBoundColumn DataField="Field7"></telerik:GridBoundColumn> 
                </Columns> 
            </telerik:GridTableView> 
        </DetailTables> 
    </MasterTableView> 
</telerik:RadGrid> 
 
protected void rgInvoices_DetailTableDataBind(object source, Telerik.Web.UI.GridDetailTableDataBindEventArgs e)  
{  
    var dataItem = (GridDataItem)e.DetailTableView.ParentItem;  
    var invoiceType =  
        (InvoiceType) Enum.Parse(typeof (InvoiceType), dataItem.GetDataKeyValue("InvoiceType").ToString());  
    CreateServiceDetailHeaders(e.DetailTableView);  
    e.DetailTableView.DataSource = GetInvoiceDetails(invoiceType);  
}  
 
private void CreateServiceDetailHeaders(GridTableView gv)  
{  
    var item = gv.GetItems(GridItemType.Header);  
    GridHeaderItem headerItem = item[0] as GridHeaderItem;  
 
    LinkButton button = headerItem["field2"].Controls[0] as LinkButton;  
    button.Text = GetLocalResource("ServiceDescriptionHeader");  
 
    //gv.Columns[0].HeaderText = GetLocalResource("ServiceDescriptionHeader");  
    gv.Columns[1].HeaderText = GetLocalResource("ServiceLaborAmountHeader");  
    gv.Columns[2].HeaderText = GetLocalResource("ServicePartAmountHeader");  
    gv.Columns[3].HeaderText = GetLocalResource("ServiceMiscAmountHeader");  
    gv.Columns[4].Visible = false;  
    gv.Columns[5].Visible = false;  
    gv.Columns[0].HeaderStyle.HorizontalAlign = HorizontalAlign.Left;  
    gv.Columns[0].ItemStyle.HorizontalAlign = HorizontalAlign.Left;  
    gv.Columns[1].HeaderStyle.HorizontalAlign = HorizontalAlign.Right;  
    gv.Columns[1].ItemStyle.HorizontalAlign = HorizontalAlign.Right;  
    gv.Columns[2].HeaderStyle.HorizontalAlign = HorizontalAlign.Right;  
    gv.Columns[2].ItemStyle.HorizontalAlign = HorizontalAlign.Right;  
    gv.Columns[3].HeaderStyle.HorizontalAlign = HorizontalAlign.Right;  
    gv.Columns[3].ItemStyle.HorizontalAlign = HorizontalAlign.Right;  

Setting the text by getting the LinkButton or by assigning to the HeaderText property of the column work for the row that was just expanded but any other detail tables that were already expanded lose these values.

Any help is greatly appreciated.

Thanks,
Dave

3 Answers, 1 is accepted

Sort by
0
Martin
Telerik team
answered on 09 Jul 2010, 03:35 PM
Hello David Louth,

Instead of localizing the header item inside the OnDetailDataBind event handler I would suggest that you use the ItemDataBound event. The code snippets bellow demonstrates this approach:

Markup:

Copy Code
Copy Code
<telerik:RadScriptManager ID="RadScriptManager1" runat="server" />
<telerik:RadGrid ID="RadGrid1" runat="server" OnNeedDataSource="RadGrid1_NeedDataSource"
    AllowPaging="True" AllowMultiRowSelection="true" ShowStatusBar="true" AllowSorting="True"
    OnDetailTableDataBind="RadGrid1_DetailTableDataBind" AutoGenerateColumns="False"
     HeaderStyle-Font-Bold="true" OnItemDataBound="RadGrid1_ItemDataBound"
    PageSize="10">
    <MasterTableView>
        <Columns>
            <telerik:GridBoundColumn DataField="Col1" UniqueName="Col1" HeaderText="Col1" SortExpression="Col1">
            </telerik:GridBoundColumn>
            <telerik:GridBoundColumn DataField="Col2" UniqueName="Col2" HeaderText="Col2" SortExpression="Col2">
            </telerik:GridBoundColumn>
        </Columns>
        <DetailTables>
            <telerik:GridTableView>
                <Columns>
                    <telerik:GridBoundColumn DataField="Col1" UniqueName="Col1" HeaderText="Col1" SortExpression="Col1">
                    </telerik:GridBoundColumn>
                    <telerik:GridBoundColumn DataField="Col2" UniqueName="Col2" HeaderText="Col2" SortExpression="Col2">
                    </telerik:GridBoundColumn>
                </Columns>
            </telerik:GridTableView>
        </DetailTables>
    </MasterTableView>
</telerik:RadGrid>


Code behind:

Copy Code
Copy Code
protected void RadGrid1_NeedDataSource(object source, GridNeedDataSourceEventArgs e)
{
    DataTable table = new DataTable();
    table.Columns.Add("Col1", typeof(int));
    table.Columns.Add("Col2", typeof(decimal));
    for (int i = 0; i < 5; i++)
    {
        table.Rows.Add(i, (i + 1) * 2);
    }
    RadGrid1.DataSource = table;
}
protected void RadGrid1_DetailTableDataBind(object source, GridDetailTableDataBindEventArgs e)
{
    DataTable table = new DataTable();
    table.Columns.Add("Col1", typeof(int));
    table.Columns.Add("Col2", typeof(decimal));
    for (int i = 0; i < 5; i++)
    {
        table.Rows.Add(i, (i + 1) * 3);
    }
   
    e.DetailTableView.DataSource = table;
}
protected void RadGrid1_ItemDataBound(object sender, GridItemEventArgs e)
{
    if (e.Item is GridHeaderItem)
    {
        GridHeaderItem item = e.Item as GridHeaderItem;
        if (item.OwnerTableView.ParentItem != null && item.OwnerTableView.ParentItem.Expanded)
        {
            LinkButton button = item["Col1"].Controls[0] as LinkButton;
            button.Text = "ServiceDescriptionHeader";
        }
    }
}

I hope this helps.

Regards,
Martin
the Telerik team
Do you want to have your say when we set our development plans? Do you want to know when a feature you care about is added or when a bug fixed? Explore the Telerik Public Issue Tracking system and vote to affect the priority of the items
0
Carl
Top achievements
Rank 1
answered on 07 Mar 2011, 06:01 PM
Hi!

Thank you for this suggestion - I am too having problems with grid header localization in master-detail views.
However, when I try the above, it only works in first level detail. If I then expand level 3, the headers in the level 2 detail somehow reverts to their default names.

Could you show an example of how to fix that?

Regards
Carl
0
Carl
Top achievements
Rank 1
answered on 08 Mar 2011, 10:06 AM
Update: I made it work using the ItemCreated event instead of the ItemDataBound event.

Regards
Carl
Tags
Grid
Asked by
David Louth
Top achievements
Rank 1
Answers by
Martin
Telerik team
Carl
Top achievements
Rank 1
Share this question
or