我的网站中有一个自定义的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)
答案 0 :(得分:0)
您可能在标记页面上的相同页面/控件上进行了此操作:
DateTime.Now
<%= %>
只是为了说明 - <%= %>
很重要。这搞砸了控制树&amp;动态添加控件(因为你不可能)。解决方法很简单 - 将所有runat="server"
语句括在<%= DateTime.Now %>
控件中 - 对此最佳控制是占位符。
所以<asp:PlaceHolder runat="server">
<%= DateTime.Now %>
</asp:PlaceHolder>
变为
"test.txt"
控制树是一致的,您可以再次从代码隐藏中动态添加控件。