两天我试着解决这个问题。
我在代码隐藏中创建了一个dropDownList,在另一个dropDownList的selectIndexChange中创建了一个dropDownList,并使用placerHolder将这个新的dropDownList添加到页面中,使其正常,但新的下拉列表selectIndexChange事件不会激活!
dropDownList创建的代码
dropDown = new DropDownList();
dropDown.AutoPostBack = true;
dropDown.ID = idSubistema;
dropDown.Width = 400;
dropDown.CssClass = "controltext";
dropDown.DataValueField = "IDNivel";
dropDown.DataTextField = "NIVEL";
dropDown.EnableViewState = true;
dropDown.DataSource =
DBLibray.DefinitionIndicadores.spSelect_FillCombosWithNivelByIdParent(
ref dataConnector,
Convert.ToInt32(idSubistema));
dropDown.DataBind();
dropDown.SelectedIndexChanged += new EventHandler(indexChange);
//dropDown.PreRender += new EventHandler(dropDown_PreRender);
placeHolderForCombos.Controls.Add(new LiteralControl("<div>"));
placeHolderForCombos.Controls.Add(lb);
placeHolderForCombos.Controls.Add(new LiteralControl("<br>"));
placeHolderForCombos.Controls.Add(dropDown);
placeHolderForCombos.Controls.Add(new LiteralControl("</div>"));
placeHolderForCombos.Controls.Add(new LiteralControl("<br>"));
没有人可以帮忙吗?
由于
答案 0 :(得分:4)
通过这种方式创建控件让你自己变得非常困难。尽管ASP.Net WebForms通过引发事件等假装像WinForms一样工作,但事实并非如此。 HTTP是无状态协议。因此,每次用户请求ASPX页面每次回发时,整个页面需要由ASP.Net重新构建。
有一个page lifecycle可以运行(init,load,pre-render等),如果在这个生命周期中没有创建控件,它将不存在,也不会被渲染给客户。通过以您正在进行的方式“动态”创建控件,您需要确保在正确的时间创建控件,每次加载页面。这种方法也使得处理Viewstate变得更加棘手,无论如何它都是一种痛苦。
你可能有一个非常复杂的页面,这使得创建像这样的控件绝对必要,但你更有可能以正常的方式在ASPX标记中编写第二个下拉列表。这将确保始终可以使用。然后,您可以有条件地数据绑定到它,并切换其Visible
属性。如果此属性为false
,则控件将不会呈现给客户端。
一般来说,ASP.Net,如果你以这种方式创建控件,那就表明你已经过度复杂了。并非总是如此,但往往不是这样。
答案 1 :(得分:1)
您正在“selectedIndexChanged”事件中创建新的下拉列表。太晚了。尝试在Page_Load或数据绑定事件中创建下拉列表。使用可见性来显示/隐藏你的ddl“idSubistema”