radgrid 中动态生成的列在回发后消失

Dynamically generated columns in radgrid disappear after postback

我正在使用 radgrid 并在 aspx 中创建它,但在某些操作中我向网格添加了更多 GridTemplateColumns。

private void CreateDateColumns(List<DateTime> occurenceList)
{
    if (occurenceList != null && occurenceList.Count > 0)
    {
        int index = 1;
        foreach (DateTime occurence in occurenceList)
        {
            string templateColumnName = occurence.Date.ToShortDateString();
            GridTemplateColumn templateColumn = new GridTemplateColumn();
            templateColumn.ItemTemplate = new MyTemplate(templateColumnName, index);
            grdStudentAttendanceList.MasterTableView.Columns.Add(templateColumn);
            templateColumn.HeaderText = templateColumnName;
            templateColumn.UniqueName = templateColumnName;

            index++;
        }
    }
}

private class MyTemplate : ITemplate
{
    protected RadComboBox rcbAttendance;
    private string colname;
    private int _index;
    public MyTemplate(string cName, int index)
    {
        colname = cName;
        _index = index;
    }
    public void InstantiateIn(System.Web.UI.Control container)
    {
        rcbAttendance = new RadComboBox();
        rcbAttendance.Items.Add(new RadComboBoxItem("---Select---", "-1"));
        rcbAttendance.Items.Add(new RadComboBoxItem("Present", "1"));
        rcbAttendance.Items.Add(new RadComboBoxItem("Absent", "2"));
        rcbAttendance.Items.Add(new RadComboBoxItem("Leave", "3"));
        rcbAttendance.ID = "rcbAttendance" + _index;
        container.Controls.Add(rcbAttendance);
    }
}

创建时一切正常,但是当我按下保存按钮或任何组合框进行回发时,唯一动态生成的列内容消失,而其他列保留。 我注意到 header 文本的列仍然存在,但只有内容消失了(在我的例子中,内容是组合框)

仅在为网格启用视图状态后 header 出现文本。

我应该怎么做才能在回发后保留列内容并获取它们的值?

When creating template columns programmatically, the grid must be generated completely in the code-behind using the Page_Init event. Then, you must create the templates dynamically in the code-behind and assign them to the ItemTemplate and EditItemTemplate properties of the column. To create a template dynamically, you must define a custom class that implements the ITemplate interface. Then you can assign an instance of this class to the ItemTemplate or EditTemplateTemplate property of the GridTemplateColumn object. Blockquote

Column templates must be added in the Page_Init event handler, so that the template controls can be added to the ViewState. Blockquote

来源:Telerik

基本上,您需要在 Page_Init 中创建所有 GridTemplateColumns。我们遇到了同样的问题,这种方法解决了它。