关于动态生成控件并调用相应事件的问题!
我因为项目需要要做一个东西,大体的意思是有一个下拉列表,当选择其中一项的时候会生成第二个下拉列表,然后选择第二个下拉列表以后会出现第三个,就这样一直出。我自己做了个实验,结果发现当我用按钮的点击事件创建下拉列表的时候,创建以后的下拉列表做选择改变,会激发相应的事件。但是当我用下拉列表的选择改事件去创建下拉列别的时候,新创建的下拉列表在第一次的选择改变回发服务器的时候却不会激发相应的事件。cs代码如下:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using Cooti_Digg.DAL;
using System.Data.SqlClient;
public partial class Test_Test1 : System.Web.UI.Page
{
public bool IsDynamicLoadControl
{
get
{
object dynamic = ViewState[ "IsDynamicLoadControl "];
return dynamic == null ? false : true;
}
set
{
ViewState[ "IsDynamicLoadControl "] = value;
}
}
protected override void LoadViewState(object savedState)
{
base.LoadViewState(savedState);
if (IsDynamicLoadControl)
{
loadDrop();
}
}
protected void Page_Load(object sender, EventArgs e)
{
}
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
if (!IsDynamicLoadControl)
{
loadDrop();
}
}
private void loadDrop()
{
DropDownList dr = new DropDownList();
dr.ID = "dorp " + DropDownList1.SelectedValue;
this.PlaceHolder1.Controls.Add(dr);
dr.SelectedIndexChanged += new EventHandler(dr_SelectedIndexChanged);
dr.Items.Add(new ListItem( "c ", "c "));
dr.Items.Add(new ListItem( "d ", "d "));
dr.AutoPostBack = true;
dr.EnableViewState = true;
IsDynamicLoadControl = true;
}
void dr_SelectedIndexChanged(object sender, EventArgs e)
{
Response.Write( "asdaskjdhaskjdhsakjdhkjsahjk ");
}
protected void Button1_Click(object sender, EventArgs e)
{
if (!IsDynamicLoadControl)
{
loadDrop();
}
}
}
[解决办法]
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class testDDL : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
if (DropDownList1.SelectedIndex == 1)
{
DropDownList ddl_2 = new DropDownList();
//ddl_2.Items.AddRange(list);
ddl_2.Items.Add(new ListItem( "请选择 ", "请选择 "));
ddl_2.Items.Add(new ListItem( "哈哈 ", "哈哈 "));
ddl_2.AutoPostBack = true;
ddl_2.SelectedIndexChanged += new EventHandler(ddl_2_SelectedIndexChanged);
ddl_2.EnableViewState = false;
Panel1.Controls.Add(ddl_2);
}
}
protected void ddl_2_SelectedIndexChanged(object sender, EventArgs e)
{
//..................
}
}
[解决办法]
protected void Page_Load(object sender, EventArgs e)
{
if(Page.IsPostBack && IsDynamicLoadControl)loadDrop() ;
}
[解决办法]
private void Page_Load(object sender, System.EventArgs e)
{
if (IsPostBack && IsDynamicLoadControl)
{
loadDrop();
}
}
private void loadDrop()
{
DropDownList dr = new DropDownList();
dr.ID = "dorp " + DropDownList1.SelectedValue;
dr.SelectedIndexChanged += new EventHandler(dr_SelectedIndexChanged);
dr.Items.Add(new ListItem( "c ", "c "));
dr.Items.Add(new ListItem( "d ", "d "));
dr.AutoPostBack = true;
dr.EnableViewState = true;
IsDynamicLoadControl = true;
this.PlaceHolder1.Controls.Add(dr);
}
[解决办法]
单纯看你的代码的话,我觉得你肯定对一些东西存在误解了。这样的问题根本不需要去碰LoadViewState,你要动态加载控件在Load里面加载就是了,此时ViewState已经架在完毕。
有关动态控件的更多技巧,请参考:
http://www.cnblogs.com/cathsfz/archive/2006/10/31/545521.html
http://www.cnblogs.com/cathsfz/archive/2006/11/05/550985.html
http://www.cnblogs.com/cathsfz/archive/2006/11/19/564929.html