2011-10-12 98 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中,或者如果您希望它們直接在頁面上,則可以將它們添加到頁面控件集合中。