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

Add template column during ItemDataBound event

4 Answers 231 Views
Grid
This is a migrated thread and some comments may be shown as answers.
Eric
Top achievements
Rank 1
Eric asked on 21 Mar 2014, 03:31 PM
Is it possible to add template columns after Page_Init? 
I have dynamic columns in a radgrid that is nested inside another radgrid that can only be calculated after the parent radgrid is bound. 
This was working fine when I was binding the parent in Page_Init, but now I am binding it with the NeedDataSource event and the template columns no longer render, since Page_Init has already fired.

Is there anything I can do after Page_Init to render the columns added?

4 Answers, 1 is accepted

Sort by
0
Princy
Top achievements
Rank 2
answered on 24 Mar 2014, 04:29 AM
Hi Eric,

When creating template columns programmatically, the grid must be generated completely in the code-behind using the Page_Init event. It must be added in the Page_Init event handler, so that the template controls can be added to the ViewState. Please take a look at this article on Creating TemplateColumns.

Thanks,
Princy
0
Eric
Top achievements
Rank 1
answered on 24 Mar 2014, 12:58 PM
When I do everything in Page_init paging doesn't work properly, so I move everything to NeedDatasource event for paging to work but then programmatically generated columns do not show up.

Is there a way to use NeedDatasource event so paging works while also creating columns programatically in page_init or do I have to do custom paging?
0
Accepted
Princy
Top achievements
Rank 2
answered on 26 Mar 2014, 05:57 AM
Hi Eric,

I was not able to replicate any issue at my end. Here is a sample code snippet which works as expected. Provide your full code snippet for further help.

ASPX:
<asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>

C#:
RadGrid RadGrid1;   
protected void Page_Init(object source, System.EventArgs e)
{
    RadGrid1 = new RadGrid();
    RadGrid1.MasterTableView.DataKeyNames = new string[] { "OrderID" };
    RadGrid1.Skin = "Default";
    RadGrid1.Width = Unit.Percentage(100);
    RadGrid1.PageSize = 15;
    RadGrid1.AllowPaging = true;
    RadGrid1.AutoGenerateColumns = false;
    RadGrid1.AllowSorting = true;
    RadGrid1.NeedDataSource += new GridNeedDataSourceEventHandler(RadGrid1_NeedDataSource);
 
    GridBoundColumn boundColumn;
    boundColumn = new GridBoundColumn();
    boundColumn.DataField = "OrderID";
    boundColumn.HeaderText = "OrderID";
    boundColumn.SortExpression = "OrderID";
    RadGrid1.MasterTableView.Columns.Add(boundColumn);
 
    boundColumn = new GridBoundColumn();
    boundColumn.DataField = "ShipCountry";
    boundColumn.HeaderText = "ShipCountry";
    boundColumn.SortExpression = "ShipCountry";
    RadGrid1.MasterTableView.Columns.Add(boundColumn);
 
 
    string templateColumnName = "CustomerID";
    GridTemplateColumn templateColumn = new GridTemplateColumn();
    templateColumn.ItemTemplate = new MyTemplate(templateColumnName);
    templateColumn.HeaderText = templateColumnName;
    templateColumn.SortExpression = "CustomerID";
    RadGrid1.MasterTableView.Columns.Add(templateColumn);
 
    this.PlaceHolder1.Controls.Add(RadGrid1);
}
void RadGrid1_NeedDataSource(object sender, GridNeedDataSourceEventArgs e)
{
    RadGrid1.DataSource = GetDataTable("SELECT  * FROM Orders");
}
public DataTable GetDataTable(string query)
{
    String ConnString = ConfigurationManager.ConnectionStrings["Northwind_newConnectionString3"].ConnectionString;
    SqlConnection conn = new SqlConnection(ConnString);
    SqlDataAdapter adapter = new SqlDataAdapter();
    adapter.SelectCommand = new SqlCommand(query, conn);
 
    DataTable myDataTable = new DataTable();
 
    conn.Open();
    try
    {
        adapter.Fill(myDataTable);
    }
    finally
    {
        conn.Close();
    }
 
    return myDataTable;
}
private class MyTemplate : ITemplate
{
    protected LiteralControl lControl;
    private string colname;
    public MyTemplate(string cName)
    {
        colname = cName;
    }
    public void InstantiateIn(System.Web.UI.Control container)
    {
        lControl = new LiteralControl();
        lControl.ID = "lControl";
        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;
        l.Text = ((DataRowView)container.DataItem)[colname].ToString() + "<br />";
    }
}

Thanks,
Princy
0
Eric
Top achievements
Rank 1
answered on 26 Mar 2014, 01:19 PM
Thanks that works
Tags
Grid
Asked by
Eric
Top achievements
Rank 1
Answers by
Princy
Top achievements
Rank 2
Eric
Top achievements
Rank 1
Share this question
or