3

英语不是我的母语;请原谅打字错误。

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

我有一个问题课

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

一个问题可能有

  • 一个文本框
  • 单选按钮列表
  • 复选框列表

在这种情况下,我的 Question 课程应该有List<WebControl>还是只有WebControl?

另外,我怎样才能在转发器中渲染 webcontrol?

4

1 回答 1

2

您应该在 CodeBehind 中使用 Repeater ItemDataBound() 事件执行此操作。您的问题类应该有一个List<Control>which 是 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>
       <asp:PlaceHolder id="PlaceHolder1" Runat="server" />
   </ItemTemplate>
于 2013-03-13T20:37:22.200 回答