我只做了一个小试验,代码很简单。有兴趣的人也可以试一下。
我在sf_manage.ascx中只放了一个按钮,给写了个事件,并在上面设了个断点。
在一个WEB窗体上,放了一个panel控件,我写下了以下两个函数:
private void Page_Load(object sender, System.EventArgs e)
{
Panel1.Controls.Add(LoadControl("sf_manage.ascx"));
}
private void Button1_Click(object sender, System.EventArgs e)
{
Panel1.Controls.Add(LoadControl("sf_manage.ascx"));
}
放在这两个不同的函数内,有不同的结果,
放在Page_Load中时,单击sf_manage.ascx中的按钮,有事件响应。
但是Button1_Click中时,单击sf_manage.ascx中的按钮,就没有事件响应了。
1。请高手们给我解释一下原因:
2。此时,我要单击web窗体上的按钮,让panel动态的加载不同的用户控件,而且用户控件能自己响应事件(但是这是用户控件上不响应事件了呀),怎么解决?
我在sf_manage.ascx中只放了一个按钮,给写了个事件,并在上面设了个断点。
在一个WEB窗体上,放了一个panel控件,我写下了以下两个函数:
private void Page_Load(object sender, System.EventArgs e)
{
Panel1.Controls.Add(LoadControl("sf_manage.ascx"));
}
private void Button1_Click(object sender, System.EventArgs e)
{
Panel1.Controls.Add(LoadControl("sf_manage.ascx"));
}
放在这两个不同的函数内,有不同的结果,
放在Page_Load中时,单击sf_manage.ascx中的按钮,有事件响应。
但是Button1_Click中时,单击sf_manage.ascx中的按钮,就没有事件响应了。
1。请高手们给我解释一下原因:
2。此时,我要单击web窗体上的按钮,让panel动态的加载不同的用户控件,而且用户控件能自己响应事件(但是这是用户控件上不响应事件了呀),怎么解决?
{
if(!IsPostBack)
{
Panel1.Controls.Add(LoadControl("sf_manage.ascx"));
}
}
private void Button1_Click(object sender, System.EventArgs e)
{
Panel1.Controls.Add(LoadControl("sf_manage.ascx"));
}
果然精通,看来你是真正的高手.
TechnoFantasy(冰儿马甲www.applevb.com) 提供的文章,看来还不适合我这个层面上的人去理解,
总之一句话,看不懂,
还请(在找托管服务器) 给点代码明示.
应该这样做:
public void Button1_Click(object sender, System.EventArgs e)
{
Control crtl = LoadControl("WebUserControl.ascx");
Panel1.Controls.Add(crtl);
((Button)crtl.FindControl("Button1")).Click +=this.Button2_Click;
Panel1.Controls.Add(new LiteralControl("load事件")); }
再加一个oninit事件:
void Page_Init(object s, EventArgs e) {
Control control1 = LoadControl("WebUserControl.ascx");
Panel1.Controls.Add(control1);
Button button1 = (Button)control1.FindControl("Button1");
button1.Click += this.Button1_Click; }
试试看,不知道可以不?
((Button)crtl.FindControl("Button1")).Click +=this.Button2_Click;
{
LoadUC();
}private void LoadUC(){
Panel1.Clear();
if(ViewState["initUC"]!=null){
UserControl UC=LoadControl(ViewState["initUC"]);
UC.ID="InnerUC";
Panel1.Controls.Add(UC);
}
}private void Button1_Click(object sender, System.EventArgs e)
{
ViewState["initUC"]="sf_manage.ascx";
LoadUC();
}不过我一般不是在PageLoad中装控件,而是在createChildControls中装的。在次大概没有什么影响。
我的问题由 sp1234(在找托管服务器) 圆满的解决了,在这很感谢这位同仁.
我想把这微薄的60分都给他,相信大家没什么意见吧.呵呵.
这里还想请教你一个问题,其实我的WEB页上有很多个按钮,每次单击我想让panel只加载一个控件,第一次单击是可以的,因为这时大家的ViewState都为null,
但是,我单击了第二个,第三个的时候,这时的panel就不再只加载一个控件了,因为这时其它的ViewState也不为空了,而且我这个问题在每个按钮事件上给其它的ViewState设为空也没得解决,不是是什么原因?
private void loadUC()
{
Panel1.Controls.Clear();
if(ViewState["add"]!=null)
{
UserControl UC1=(UserControl)LoadControl((string)ViewState["add"]);
UC1.ID="uc_add";
Panel1.Controls.Add(UC1);
}
if(ViewState["check"]!=null)
{
UserControl UC2=(UserControl)LoadControl((string)ViewState["check"]);
UC2.ID="uc_check";
Panel1.Controls.Add(UC2);
}
if(ViewState["manage"]!=null)
{
UserControl UC3=(UserControl)LoadControl((string)ViewState["manage"]);
UC3.ID="uc_manage";
Panel1.Controls.Add(UC3);
}
}
{
ViewState["initUC"]="sf_add.ascx";
LoadUC();
}private void ButtonCheck_Click(object sender, System.EventArgs e)
{
ViewState["initUC"]="sf_check.ascx";
LoadUC();
}private void ButtonManageClick(object sender, System.EventArgs e)
{
ViewState["initUC"]="sf_manage.ascx";
LoadUC();
}而Page_load 和 LoadUC 的代码不变,仍然是只加载ViewState中记住的那一个。
使用你的方法,可以在Panel中加载多个用户控件,也可以“在每个按钮事件上给其它的ViewState设为空”来使其它用户控件不加载,你的代码看不出为什么出错。你应该在按钮事件中设置断点,然后打开监视窗口设置变量监视,单步执行,察看那些ViewState值何时变化。