簡體   English   中英

通過DropDownList將動態ASP.NET控件添加到頁面

[英]Add dynamic ASP.NET controls via a DropDownList to the page

-主要信息:
在我最近的項目中,我需要一個包含DropDownList的頁面,其中包含一些項目,例如“ firstName”,“ lastName”,“ Age”等。當用戶選擇每個項目時,我想向該頁面添加可選控件。 例如,當用戶選擇“年齡”時,將使用這些值動態創建另一個下拉列表:“小於10”
“ 10到30之間”
“超過30”
這是一個將此用戶選擇添加到listBox並允許用戶選擇其他選項的按鈕。 (我最后根據用戶選擇進行了查詢,並將其發送到數據庫)
- 我所做的:
我創建了一個dropDownList並將其AutoPostBack屬性設置為true,並在其中添加了一些項目,用戶必須選擇其中一項。 然后在回發頁面之前,在Cache變量中添加dropDownList的用戶SelectedValue:

protected void DropDownListColumnNameSelectedIndexChanged(object sender, EventArgs e)
    {
        Cache["SelectedKey"] = dropDownListColumnName.SelectedValue;
    }

當用戶從dropDownList * DropDownList_SelectedIndexChanged *中選擇一項時,我必須在占位符中動態創建控件:

 var textBoxName = new TextBox
    {
        ID = "textBoxName",
        CssClass = "str-search-textbox-highlight",
        ViewStateMode = ViewStateMode.Disabled
    };
 placeHolderFirstItem.Controls.Add(textBoxName);

- 問題是什么? 當我嘗試在當前Button_Click事件中添加新的控制,控制成功添加到頁面,但我不能placeHolderFirstItem.Controls.Find(“textBoxName”)發現它實際上placeHolderFirstItem.Controls.Count始終為零。 所以我無法獲取textBoxName.Text值。
我嘗試用谷歌搜索任何解決方案,但發現一些解決方案,必須在Page.OnInit中添加控件,因此我要在覆蓋的OnInit(e)中添加控件:

protected override void OnInit(EventArgs e)
        {
            if (!Page.IsPostBack) return;
            var textBoxName = new TextBox
               {
                   ID = "textBoxName",
                   CssClass = "str-search-textbox-highlight",
                   ViewStateMode = ViewStateMode.Disabled
               };
            placeHolderFirstItem.Controls.Add(textBoxName);
        }

完成此操作后,我可以在placeHolderFirstItem中找到“ textBoxName”,但它會在DropDownList_SelectedIndexChanged之前觸發!
因此,當用戶更改dropDownList值時,如何將新控件准確地添加到占位符中?如何讀取新控件的值?
提前致謝,
莫森

- 更新:
這是更好的解決方案
http://forums.asp.net/p/1959726/5596531.aspx?p=True&t=635244790943067485&pagenum=1

在動態添加控件時,此后每次都必須將控件重新加載到控件樹中才能顯示。 借助viewstate,您可以將代碼示例更改為:

ViewState("ShowTextbox") = true

然后在您的初始化例程中:

protected override void OnInit(EventArgs e)
    {
        if (!Page.IsPostBack) return;

        if (ViewState("ShowTextBox") == true) {
           var textBoxName = new TextBox
           {
               ID = "textBoxName",
               CssClass = "str-search-textbox-highlight",
               ViewStateMode = ViewStateMode.Disabled
           };
           placeHolderFirstItem.Controls.Add(textBoxName);
        }
    }

請注意,由於這些ASP.NET控件樹問題,在控件樹上具有控件然后通過將Visible設置為true / false來顯示/隱藏要容易得多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM