我有一个下拉列表,其中包含一些选项。根据用户选择,我需要创建一些动态控件并在表单上呈现它们。
我的理解是需要在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;”行上我希望获得当前选择并基于该设置动态控件的text属性的值。但目前的选择还没有确定,因为它在OnInit中。
答案 0 :(得分:2)
如果确实需要在OnInit或CreateChildControls中创建控件,那么您可以做的一件事是在OnInit期间从Request.Form []集合中获取静态控件的值。
所以不要这样做:
string selected = myDropDown.SelectedValue;
你做了
string selected = Request.Form[myDropDownUniqueID];
...其中myDropDownID是分配给myDropDown的“唯一ID”。请注意,通常这将与分配给控件的“id”相同,除非它位于控件容器中。
这有效地将值直接从发送到服务器的HTML表单数据中提取出来,而不是等待ASP.NET将其解压缩到控件的属性中。
答案 1 :(得分:1)
在我的一个项目中,我在Page_Load中动态添加控件。
我使用SaveControlState和LoadControlState手动保存并加载控件视图状态。
http://msdn.microsoft.com/en-us/library/system.web.ui.control.loadcontrolstate.aspx
吉文。