![](/img/trans.png)
[英]is that possible to add controls into WebUserControl from aspx page?
[英]Add array of controls to an aspx page
我正在尝试向aspx页面添加一组控件(后面的C#代码)。 这些是类似的控件(单独字段的搜索条件,但具有相同的值)。 下拉控件值当前在Page_Load方法中设置,如下所示:
protected void Page_Load(object sender, EventArgs e) {
ListItem[] items = new ListItem[3];
//these values are actually set by a database query
items[0] = new ListItem('Apple', 'Apple');
items[1] = new ListItem('Orange', 'Orange');
items[2] = new ListItem('Banana', 'Banana');
FruitDropDown.Items.AddRange(items);
FruitDropDown.DataBind();
}
然后在页面上我有一个控件像:
<asp:DropDownList ID="FruitDropDown" runat="server"/>
这工作正常并填充控件,但我想现在创建一个这些下拉列表 - 其中将有20个,所以我不想在Page_Load方法中创建它20次。 我应该在列表中添加下拉填充,然后执行以下操作:
<asp:DropDownList ID="FruitDropDown[0]" runat="server"/>
<asp:DropDownList ID="FruitDropDown[1]" runat="server"/>
我如何在页面上标记它们然后能够访问控制器中的这些值? 如果我已经将这些命名控件添加到aspx页面,我可以这样做吗?
protected void Page_Load(object sender, EventArgs e) {
ListItem[] items = new ListItem[3];
//these values are actually set by a database query
items[0] = new ListItem('Apple', 'Apple');
items[1] = new ListItem('Orange', 'Orange');
items[2] = new ListItem('Banana', 'Banana');
for (int x = 0; x < 20; x++) {
FruitDropDown[x].Items.AddRange(items);
FruitDropDown[x].DataBind();
}
这是否还需要复制和粘贴aspx页面上的控件20次? 如果它扩展到100怎么办? 我可以在aspx页面上的循环中添加它们吗?
Control.FindControl就是你要找的。 您可以在任何Control(如Page本身)上使用它来通过NamingContainer查找控件。 将它们放在Panel中并在其上使用FindControl。
for (int x = 0; x < 20; x++) {
DropDownList ddlFruit = (DropDownList)FruitPanel.FindControl("FruitDropDown" + x);
ddlFruit.Items.AddRange(items[x]);
}
您也可以动态创建它们:
for (int x = 0; x < 20; x++) {
DropDownList ddlFruit = new DropDownList();
ddlFruit.ID = "FruitDropDown" + x
ddlFruit.Items.AddRange(items[x]);
FruitPanel.Controls.Add(ddlFruit);
}
您必须在最新的Page_Load中使用与以前相同的ID在每个回发上重新创建动态创建的控件,以确保正确加载ViewState并触发事件。
你可以给他们有效的ID,并将它们全部放在一个数组中:
<asp:DropDownList ID="FruitDropDown0" runat="server"/>
<asp:DropDownList ID="FruitDropDown1" runat="server"/>
protected void Page_Load(object sender, EventArgs e) {
ListItem[] items = new ListItem[3];
...
DropDownList[] lists = new DropDownList[] { FruitDropDown0
,FruitDropDown1
,...};
foreach(DropDownList list in lists) {
list.Items.AddRange(items);
list.DataBind();
}
}
从您的问题看起来您正在尝试在屏幕上动态渲染控件
您应该考虑动态创建控件。
就像@Mark Cidade所说,你最好的方法是在后面的代码中创建控件。 毕竟他们只是课程。
最简单的方法是在标记中放置一个控件,例如placeHolder控件,然后在循环中创建一个下拉列表集合,为每个人提供一个像@Mark Cidade所说的唯一ID。
从那里开始将它们作为子控件添加到placeHolder中,或者如果您希望它们直接在页面上,您可以将它们添加到页面控件集合中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.