英语不是我的母语;请原谅输入错误。
我正在创建一个调查类型的应用程序,我不确定如何处理,所以我一直在做一些试验和错误。
我有一个问题类
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
可能有一个问题
在这种情况下,我的问题课程应该List<WebControl>
还是WebControl
?
另外,如何在转发器中呈现web控件?
答案 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>