首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

关于动态生成控件并调用相应事件的有关问题

2012-01-06 
关于动态生成控件并调用相应事件的问题!我因为项目需要要做一个东西,大体的意思是有一个下拉列表,当选择其

关于动态生成控件并调用相应事件的问题!
我因为项目需要要做一个东西,大体的意思是有一个下拉列表,当选择其中一项的时候会生成第二个下拉列表,然后选择第二个下拉列表以后会出现第三个,就这样一直出。我自己做了个实验,结果发现当我用按钮的点击事件创建下拉列表的时候,创建以后的下拉列表做选择改变,会激发相应的事件。但是当我用下拉列表的选择改事件去创建下拉列别的时候,新创建的下拉列表在第一次的选择改变回发服务器的时候却不会激发相应的事件。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

热点排行