在代码隐藏中创建下拉列表时,SelectedIndexChanged事件不会触发

时间:2010-12-09 12:41:12

标签: asp.net

两天我试着解决这个问题。

我在代码隐藏中创建了一个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>"));

没有人可以帮忙吗?

由于

2 个答案:

答案 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”