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

ItemTemplate missing for dynamically created template columns on rebind

4 Answers 240 Views
Grid
This is a migrated thread and some comments may be shown as answers.
John
Top achievements
Rank 1
John asked on 06 Dec 2010, 08:51 PM
I followed the example found in your documentation at the link below on programmatically creating template columns.

http://www.telerik.com/help/aspnet-ajax/grdprogrammaticcreation.html#Creating_template_columns_programmatically


This works great for the initial data binding of the grid.  However, on a subsequent postback when I call Rebind the output for the column with custom item template is blank.  When I use the debugger to step through the NeedDataSource event handler it appears the custom item template is no longer associated with the column.  The ItemTemplate property on the column is now null. 

I followed the recommendation to add the new column to the collection before setting properties. 

templateColumn = new GridTemplateColumn();
rgPlans.Columns.Add(templateColumn);
templateColumn.HeaderText = "Custom Column";
templateColumn.ItemTemplate = new CustomFieldTemplate("MyCustomId");

Other non-template columns on my grid which I created dynamically seem to retain their settings.

Any ideas on why the column item template was lost?

Thanks

4 Answers, 1 is accepted

Sort by
0
Marin
Telerik team
answered on 07 Dec 2010, 03:59 PM
Hi John,

Indeed this is not expected behavior for the grid. The code snippet looks ok. Can you post a full code sample or runnable project so we can provide better assistance? I presume there might be some problems with binding of the column and the persistence in the ViewState. Please refer to the attached project based on the above mentioned help article and see what differs in your case.

Regards,
Marin
the Telerik team
Browse the vast support resources we have to jumpstart your development with RadControls for ASP.NET AJAX. See how to integrate our AJAX controls seamlessly in SharePoint 2007/2010 visiting our common SharePoint portal.
0
John
Top achievements
Rank 1
answered on 07 Dec 2010, 07:14 PM
Hi Marin,

I've included sample code which demonstrates the problem.

<telerik:RadGrid ID="MyGrid" runat="server" OnNeedDataSource="MyGrid_NeedDataSource" AutoGenerateColumns="false" />
<br /><br />
<asp:Button ID="MyButton" runat="server" OnClick="MyButton_Click" Text="Rebind" />

protected void Page_Load(object sender, EventArgs e)
{
    if (Page.IsPostBack == false)
    {
        GridBoundColumn boundColumn = new GridBoundColumn();
        MyGrid.Columns.Add(boundColumn);
        boundColumn.HeaderText = "My Key";
        boundColumn.DataField = "ItemKey";
        GridTemplateColumn templateColumn = new GridTemplateColumn();
        MyGrid.Columns.Add(templateColumn);
        templateColumn.HeaderText = "Custom 1";
        templateColumn.ItemTemplate = new CustomFieldTemplate("CustomField1");
        templateColumn = new GridTemplateColumn();
        MyGrid.Columns.Add(templateColumn);
        templateColumn.HeaderText = "Custom 2";
        templateColumn.ItemTemplate = new CustomFieldTemplate("CustomField2");
    }
}
protected void MyGrid_NeedDataSource(object sender, EventArgs e)
{
    List<Widget> widgetList = new List<Widget>();
    Widget widget = new Widget();
    widgetList.Add(widget);
    widget.ItemKey = "1";
    widget.CustomDataItemList = new List<CustomDataItem>();
    widget.CustomDataItemList.Add(new CustomDataItem { CustomItemKey = "CustomField1", CustomItemValue = "Blue" });
    widget.CustomDataItemList.Add(new CustomDataItem { CustomItemKey = "CustomField2", CustomItemValue = "Large" });
    widget = new Widget();
    widgetList.Add(widget);
    widget.ItemKey = "2";
    widget.CustomDataItemList = new List<CustomDataItem>();
    widget.CustomDataItemList.Add(new CustomDataItem { CustomItemKey = "CustomField1", CustomItemValue = "Red" });
    widget.CustomDataItemList.Add(new CustomDataItem { CustomItemKey = "CustomField2", CustomItemValue = "Small" });
    widget = new Widget();
    widgetList.Add(widget);
    widget.ItemKey = "3";
    widget.CustomDataItemList = new List<CustomDataItem>();
    widget.CustomDataItemList.Add(new CustomDataItem { CustomItemKey = "CustomField1", CustomItemValue = "Green" });
    widget.CustomDataItemList.Add(new CustomDataItem { CustomItemKey = "CustomField2", CustomItemValue = "Medium" });
    MyGrid.DataSource = widgetList;
}
protected void MyButton_Click(object sender, EventArgs e)
{
    MyGrid.Rebind();
}
private class Widget
{
    public string ItemKey { get; set; }
    public List<CustomDataItem> CustomDataItemList { get; set; }
}
private class CustomDataItem
{
    public string CustomItemKey {get;set;}
    public string CustomItemValue {get;set;}
}
private class CustomFieldTemplate : ITemplate
{
    protected LiteralControl lControl;
    private string _customItemKey;
    public CustomFieldTemplate(string customItemKey)
    {
        _customItemKey = customItemKey;
    }
    public void InstantiateIn(System.Web.UI.Control container)
    {
        lControl = new LiteralControl();
        lControl.DataBinding += new EventHandler(lControl_DataBinding);
        container.Controls.Add(lControl);
    }
    public void lControl_DataBinding(object sender, EventArgs e)
    {
        LiteralControl l = (LiteralControl)sender;
        GridDataItem container = (GridDataItem)l.NamingContainer;
          
        Widget widget = container.DataItem as Widget;
        CustomDataItem item = (from cdi in widget.CustomDataItemList
                               where cdi.CustomItemKey == _customItemKey
                               select cdi).FirstOrDefault();
          
        l.Text = (item == null ? "{empty}" : item.CustomItemValue);
    }
}  


Regards
John
0
Marin
Telerik team
answered on 08 Dec 2010, 02:50 PM
Hello John,

When you add template column you have to do it in the Page_Init event so that they are persisted in the ViewState. Also the whole grid has to be created in the code behind. You need to follow the presented approach in the section Creating template columns programmatically in the help article.

Hope this helps.

Regards,
Marin
the Telerik team
Browse the vast support resources we have to jumpstart your development with RadControls for ASP.NET AJAX. See how to integrate our AJAX controls seamlessly in SharePoint 2007/2010 visiting our common SharePoint portal.
0
John
Top achievements
Rank 1
answered on 08 Dec 2010, 03:06 PM
Hi Marin,

I now see the warning footnote in the documentation about creating template columns inside the Page_Load event handler.  I must have overlooked it because it was shown after the VB code sample which was of no interest to me.  I will rework my code to create the grid inside the Page_Init event hander.

Thanks for your help!

Regards,
John
Tags
Grid
Asked by
John
Top achievements
Rank 1
Answers by
Marin
Telerik team
John
Top achievements
Rank 1
Share this question
or