将控件数组添加到aspx页面

时间:2011-10-12 21:00:04

标签: c# asp.net arrays controls

我正在尝试将一组控件添加到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页面的循环中添加它们吗?

5 个答案:

答案 0 :(得分:4)

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并触发事件。

答案 1 :(得分:3)

您可以为他们提供有效的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();
   }
}

答案 2 :(得分:1)

从您的问题看,您似乎正在尝试在屏幕上动态渲染控件

Here is a good article on doing this.

答案 3 :(得分:0)

您应该考虑动态创建控件。

http://support.microsoft.com/kb/317794

答案 4 :(得分:0)

就像@Mark Cidade所说,你最好的方法是在后面的代码中创建控件。毕竟他们只是课程。

最简单的方法是在标记中放置一个控件,例如placeHolder控件,然后在循环中创建一个下拉列表集合,为每个人分配一个像@Mark Cidade所说的唯一ID。

从那里开始将它们作为子控件添加到placeHolder中,或者如果您想直接在页面上将它们添加到页面控件集合中。