C#生成的动态控件没有显示

时间:2011-08-12 10:17:55

标签: c# asp.net checkboxlist htmltextwriter

我的一个页面上有以下C#代码:

protected override void Render(HtmlTextWriter writer) 
    {
        //an array named fieldNames is delcared here

        writer.Write("<form id=\"Form1\" runat=\"server\" action=\"\">");
        writer.Write("<asp:checkboxlist id=\"checkBoxes\" runat=\"server\">");
        for (int count = 0; count < fieldNames.GetLength(0); count++)
        {  //iterates over the array of field names
            writer.Write("<asp:listitem text=" + fieldNames[count] + " value=" + fieldNames[count] + "/>");
        }
        writer.Write("</asp:checkboxlist>");
        writer.Write("</form>");
    }

目的是创建一个动态设置其属性的复选框列表。

运行时,这不会引发任何错误,但页面上不会显示任何控件。

当我查看页面的来源时,我得到以下html:

<form id="Form1" runat="server" action="">
    <asp:checkboxlist id="checkBoxes" runat="server">
        <asp:listitem text='Spares Part No' value='Spares Part No'/>
        <asp:listitem text='Description' value='Description'/>
        <asp:listitem text='Site' value='Site'/>
        <asp:listitem text='Rack/Bin Number' value='Rack/Bin Number'/>
    </asp:checkboxlist>
</form>

出于兴趣,我在另一个应用程序中发布了它,它运行正常,显示了所有控件。

这是调用事件的顺序的问题吗?我对于接下来要尝试什么感到有点失落,所以任何建议都会很棒。

谢谢,

奥利弗

3 个答案:

答案 0 :(得分:1)

基本上你不能这样做。

Render事件在页面生命周期中很晚才出现。您不能只输出ASPX标记,因为解析标记,实例化控件等的事件已经运行。

您应该做的是在标记中向您的页面添加PlaceHolder控件,然后在之前的事件(例如Init或Load)中添加您想要的控件到该占位符。再次,您不能只写出ASPX标记,但是,您需要实例化控件,如下所示:

var checkbox = new CheckboxList { Id = "checkBoxes" };
uxPlaceHolder.Controls.Add(checkbox);
checkbox.Items.Add(new ListItem { Text = "...", Value = "..." });

您可以实现所需的一种方法是使用VirtualPathProvider为框架请求的.aspx请求生成标记。或者你可以查看你实际想要生成的HTML输出(即带有一些相关javascript的输入元素列表)并直接渲染它们。但是,这些都可能被归类为令人讨厌的黑客。

答案 1 :(得分:0)

您正在渲染服务器端代码 - 浏览器无法理解。

您必须在页面呈现之前将CheckBoxList及其ListItem添加到表单。

服务器端控件为浏览器呈现html - 通常由Asp.Net解析服务器端标记。

答案 2 :(得分:0)

您直接将html内容写入浏览器,因此您应该只使用html标记。