动态创建不同类型的Web控件

时间:2013-03-13 20:14:33

标签: c# asp.net web-controls

英语不是我的母语;请原谅输入错误。

我正在创建一个调查类型的应用程序,我不确定如何处理,所以我一直在做一些试验和错误。

我有一个问题类

public class Question
{
    public int QuestionID;
    public string QuestionText;
    public int InputTypeID;
    public List<WebControl> Controls;

    public Question()
    {
        //initialize fields;
    }

    internal Question(int id, string text, int inputTypeId)
    {
        //assign parameters to fields
        switch(inputTypeId)
        {
            case 1:
                //checkbox
                break;
            case 2:
                //textbox
                TextBox t = new TextBox();
                Controls = new List<WebControl>();
                Controls.Add(t);
                break;
            ...
        }
    }
}

我的Question.aspx看起来像这样:

<asp:Repeater ID="repeater" runat="server">
    <ItemTemplate>
        //Want to display a control dynamically here
    </ItemTemplate>
</asp:Repeater>

我试过这个,但显然没有用......

<asp:Repeater ID="repeater" runat="server">
    <ItemTemplate>
        <%# DataBinder.Eval(Container.DataItem, "Controls") %>
    </ItemTemplate>
</asp:Repeater>

我得到了这个。

System.Collections.Generic.List`1[System.Web.UI.WebControls.WebControl] System.Collections.Generic.List`1

可能有一个问题

  • 一个文本框
  • radiobutton list
  • 复选框列表

在这种情况下,我的问题课程应该List<WebControl>还是WebControl

另外,如何在转发器中呈现web控件?

1 个答案:

答案 0 :(得分:2)

您应该使用Repeater ItemDataBound()事件在CodeBehind中执行此操作。您的问题类应该有一个List<Control>,它是WebControl和其他控件的基类,允许灵活地使用不同类型的控件。

不必使用Page_Load,只是例如,

   void Page_Load(Object Sender, EventArgs e) 
   {
         Repeater1.ItemDataBound += repeater1_ItemDataBound;
         Repeater1.DataSource = [your List<Control> containing controls to add];
         Repeater1.DataBind();
   }

   void Repeater1_ItemDataBound(Object Sender, RepeaterItemEventArgs e) 
   {

      // Execute the following logic for Items and Alternating Items.
      if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
      {

         var controlToAdd = (Control)e.Item.DataItem;
         ((PlaceHolder)e.Item.FindControl("PlaceHolder1")).Controls.Add(controlToAdd);

      }
   }    

和ItemTemplate:

   <ItemTemplate>
       <asp:PlaceHolder id="PlaceHolder1" Runat="server" />
   </ItemTemplate>