2011-10-12 100 views
3

我试图添加一个控件数组到一个aspx页面(后面的C#代码)。这些是类似的控件(单独字段的搜索条件,但将具有相同的值)。下拉控制值在Page_Load方法的当前设置,像这样:添加控件到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'); 

    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页面的循环中吗?

回答

3

你可以给他们有效身份证件,并把他们都在自己的数组:

<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(); 
    } 
} 
+0

因此,我必须剪切并粘贴 line 20次(或更多)并在ID中增加计数器?我可以在页面上的循环中创建它,所以我不必维护复制的代码? – George

4

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是正确加载和事件被触发。

+0

如果我使用FindControl,我必须在页面本身上创建这些控件20次吗?这可以在循环中完成,以最小化复制的代码? – George

+0

您也可以在动态创建的控件上使用'FindControls'。但正如您在我的示例中所看到的,您可以在一个循环中执行两次而不使用findcontrol,因为您已经在那里引用了新创建的控件。 –

+0

如果我使用第二个示例动态创建它们,我知道它们将被添加到aspx页面上的FruitPanel控件。但是,这是如何处理定位和布局?我想创建一些动态文本框/下拉列表并将它们添加到单行中。我将如何通过调用add方法来控制布局?我是否必须手动设置位置?我可以在页面中添加20个控件,但是这似乎是一种不好的方式 - 我怎么才能将这些控件添加到页面的循环中以保持布局一致? – George

0

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

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

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