【问题标题】:Add array of controls to an aspx page将控件数组添加到 aspx 页面
【发布时间】:2011-12-06 11:40:24
【问题描述】:

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

【问题讨论】:

    标签: c# asp.net arrays controls


    【解决方案1】:

    Control.FindControl 是您正在寻找的。您可以在任何控件(如页面本身)上使用它来通过其NamingContainer 查找控件。把它们放在例如在面板中并在其上使用 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 并触发事件。

    【讨论】:

    • 如果我使用 FindControl,我是否必须在页面本身上创建这些控件 20 次?可以在循环中完成以最小化复制代码吗?
    • 您也可以在动态创建的控件上使用FindControls。但正如您在我的示例中看到的那样,您可以在一个循环中执行这两项操作,而无需 findcontrol,因为您已经有了对新创建控件的引用。
    • 如果我使用第二个示例动态创建它们,我知道它们将被添加到 aspx 页面上的 FruitPanel 控件中。但是,这如何处理定位和布局?我想创建一些动态文本框/下拉菜单并将它们添加到一行中。我将如何通过调用 add 方法来控制布局?我必须手动设置位置吗?我可以向页面添加 20 个控件,但这似乎是一种不好的方法 - 我如何在页面上循环添加这些控件以保持布局一致?
    • FruitPanel 的定位和布局应该由 CSS 控制,就像 DropDownList 一样。如果您需要对每个 DropDown 的布局进行更多控制,您应该向我们展示一个模型,那么您可能应该使用其他 Container 控件,例如 RepeaterGridView,这也使得控件的动态创建变得多余。
    【解决方案2】:

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

    【讨论】:

    • 那么我是否必须剪切并粘贴 行 20 次(或更多)并增加 ID 中的计数器?我可以在页面上循环创建它,这样我就不必维护复制的代码了吗?
    【解决方案3】:

    从您的问题看来,您正在尝试在屏幕上动态呈现控件

    Here is a good article on doing this.

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

        最简单的方法是在标记中放置一个诸如 placeHolder 控件之类的控件,然后在循环中创建一组下拉列表,为每个列表分配一个唯一的 ID,就像 @Mark Cidade 所说的那样。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-06-14
          • 1970-01-01
          相关资源
          最近更新 更多