将自定义GridView添加到控件集合

时间:2015-09-02 08:19:37

标签: c# asp.net gridview

我的网站中有一个自定义的GridView控件,基本上只是一个将GridView扩展为

的类
    ITCSGridView : GridView

这导致导出到excel功能中的错误,该功能将控件添加到表格单元格然后导出它。发生错误的行是:

    NewTableCell(ATable).Controls.Add(AControl);

抛出的异常是:

    The Controls collection cannot be modified because the control contains code blocks (i.e. <% ... %>).

在我扩展GridView控件之前,导出功能正常工作。我发现让它工作的唯一方法是传递自定义GridView的第一个子控件(类型为System.Web.UI.WebControl.ChildTable),但后来我失去了所需的样式。

非常感谢任何帮助。

编辑:下面添加了其他代码

自定义GridView类

    public class ITCSGridView : GridView
    {
        private const string ControlHeaderBackColor = "#B0E0E6";
        private const string ControlHeaderForeColor = "#000000";
        private const string ControlSelectedRowStyleForeColor = "#335555";

        public ITCSGridView() : base()
        {
            ControlProperties();
            HeaderProperties();
            PagerProperties();
            RowProperties();
        }

        private void ControlProperties()
        {
            EnableTheming = true;
            Width = new Unit("100%");
            SkinID = "ITCSGridView";
            CellPadding = 2;
            BorderStyle = BorderStyle.None;
            HorizontalAlign = HorizontalAlign.Center;
            AllowSorting = true;
        }

        private void HeaderProperties()
        {
            HeaderStyle.HorizontalAlign = HorizontalAlign.Left;
            HeaderStyle.BackColor = ColorTranslator.FromHtml(ControlHeaderBackColor);
            HeaderStyle.ForeColor = ColorTranslator.FromHtml(ControlHeaderForeColor);
            HeaderStyle.Font.Bold = false;
        }

        private void PagerProperties()
        {
            AllowPaging = true;
            PageSize = SASMisc.DDLGridViewPageSize;
            PagerSettings.Position = PagerPosition.TopAndBottom;
            PagerSettings.Mode = PagerButtons.NumericFirstLast;
            PagerSettings.FirstPageText = "First";
            PagerSettings.LastPageText = "Last";
        }

        private void RowProperties()
        {
            RowStyle.Wrap = false;
            SelectedRowStyle.ForeColor = ColorTranslator.FromHtml(ControlSelectedRowStyleForeColor);
            SelectedRowStyle.Font.Bold = false;
        }

在处理将控件导出到Excel的类中,创建了System.Web.UI.WebControls.Table控件,并将GridView控件添加到Table Control中的TableCell,对NewTableCell(ATable)的调用是返回System.Web.UI.WebControls.TableCell的方法。这基本上只是:

    // The GridView control is passed directly to this method from the aspx.cs
    private void AddControlToTable(System.Web.UI.WebControls.Table ATable, Control AControl){
        var Table = new System.Web.UI.WebControls.Table();
        // Excpetion thrown on line below (this works when using standard GridView instead of custom extended)
        NewTableCell(ATable).Controls.Add(AControl);
    }

    private TableCell NewTableCell(System.Web.UI.WebControls.Table ATable)
    {
        TableCell Lcell = new TableCell();
        TableRow LRow = new TableRow();
        LRow.Cells.Add(Lcell);
        ATable.Rows.Add(LRow);
        return Lcell;
    } // private TableCell AddToTable(Table ATable)

1 个答案:

答案 0 :(得分:0)

您可能在标记页面上的相同页面/控件上进行了此操作:

DateTime.Now

<%= %>只是为了说明 - <%= %>很重要。这搞砸了控制树&amp;动态添加控件(因为你不可能)。解决方法很简单 - 将所有runat="server"语句括在<%= DateTime.Now %>控件中 - 对此最佳控制是占位符。

所以<asp:PlaceHolder runat="server"> <%= DateTime.Now %> </asp:PlaceHolder> 变为

"test.txt"

控制树是一致的,您可以再次从代码隐藏中动态添加控件。