2009-10-21 104 views
1

我有一個下拉列表,裏面有一些選擇。基於用戶選擇,我需要創建一些動態控件並將它們呈現在窗體上。根據靜態控件的選定值創建動態控件

我的理解是,需要在OnInit或CreateChildControls中創建動態控件,以便這些動態控件的ViewState可以由運行時正確恢復。

問題是,我無法獲取OnInit或CreateChildControls中的下拉列表的SelectedValue,因爲尚未恢復ViewState的下拉列表。

有什麼辦法來獲得當前的選擇,這樣我可以創建基於當前用戶選擇的動態控制,並將它們添加頁面正確

編輯: 的標記如下所示:

<form id="form1" runat="server"> 
<div> 
    <asp:DropDownList ID="ddl" runat="server" AutoPostBack="true" AppendDataBoundItems="true"> 
     <asp:ListItem Text="(Select Color)" Value="" /> 
     <asp:ListItem Text="Red" Value="Red" /> 
     <asp:ListItem Text="Green" Value="Green" /> 
     <asp:ListItem Text="Blue" Value="Blue" /> 
    </asp:DropDownList> 
    <asp:PlaceHolder ID="plHolder" runat="server" /> 
</div> 
</form> 

這裏是後面的代碼:

public partial class _Default : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 

    protected override void CreateChildControls() 
    { 
     base.CreateChildControls(); 
     TextBox tb = new TextBox(); 
     if (ddl.Text != "") 
     { 
      tb.Text = ddl.Text; 
      if (Session["id"] != null) 
      { 
       string id = Session["id"].ToString(); 
       tb.ID = id; 
      } 
      else 
      { 
       Session["id"] = tb.ID = Guid.NewGuid().ToString().Replace("-", ""); 
      } 
      plHolder.Controls.Add(tb); 
     } 

    } 
} 

在線 「tb.Text = ddl.Text;」我希望得到當前的選擇,並基於該設置動態控制的文本屬性的值。但是目前的選擇尚未在OnInit中設置。

+0

你需要發佈一些代碼來檢查問題出在哪裏,根據你的說法,它似乎沒問題。 – 2009-10-21 06:00:25

+0

我已經添加了一些代碼來捕捉我想要做的事情的本質 – 2009-10-21 06:09:28

回答

2

如果真的需要在OnInit或CreateChildControls中創建控件,那麼您可以做的一件事就是在OnInit中從Request.Form []集合中獲取靜態控件的值。

所以不是這樣做的:

string selected = myDropDown.SelectedValue; 

你做

string selected = Request.Form[myDropDownUniqueID]; 

...其中myDropDownID是分配給myDropDown的唯一的ID「。請注意,通常這與分配給控件的'id'相同,除非它在控制容器內。

這有效地將值直接從發送到服務器的HTML表單數據中提取出來,而不是等待ASP.NET將其解壓縮到控件的屬性中。

+0

@codeulike:當下拉標識定義爲獨立的而不是在任何容器中時,Request.Form [myDropDownUniqueID]似乎工作的很好。 當下拉菜單是GridView中EditItemTemplate的一部分時,如何獲取唯一ID的任何建議?我需要獲取正在編輯的當前行的下拉列表的uniqueId。 – 2009-10-21 06:17:19

+0

我想在OnInit期間,GridView控件不會準備好告訴你它包含了什麼。您最好的選擇可能是循環前一個回傳中的GridView控件(例如,在數據綁定後不久),提取每個控件的UniqieID並將它們存儲在Session []中供以後使用。 – codeulike 2009-10-21 06:27:24

+0

或...在GridViews中分配給控件的UniqueID是相當可預測的(查看呈現的頁面的源代碼)。你可能會利用這一點。你也可以通過Forms []集合循環尋找匹配模式的鍵。 – codeulike 2009-10-21 06:35:55