2009-10-21 99 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