用户控件动态交替加载遇到的问题

caomin9989 2011-12-31 04:36:32
aspx:


@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm5.aspx.cs" Inherits="WebApp.WebForm5" %>

<%@ Register src="WebUserControl1.ascx" tagname="WebUserControl1" tagprefix="uc1" %>
<%@ Register src="WebUserControl2.ascx" tagname="WebUserControl2" tagprefix="uc2" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>无标题页</title>
</head>
<body>
<form id="form1" runat="server">
<div >

<asp:Panel ID="Panel1" runat="server">
</asp:Panel>

</div>
<asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="显示1" />
<asp:Button ID="Button2" runat="server" Text="显示2" onclick="Button2_Click" />
<asp:Button ID="Button3" runat="server" onclick="Button3_Click"
Text="用户控件里按钮的Text" />
</form>
</body>
</html>
-----------------------------------------------------------------------------------------------------
cs:
protected void Page_Load(object sender, EventArgs e)
{

if (!Page.IsPostBack)
{
Session["cname"] = "WebUserControl1.ascx";

}
addcontrol();

}

protected void Button1_Click(object sender, EventArgs e)
{
Session["cname"] = "WebUserControl1.ascx";
addcontrol();

}

protected void Button2_Click(object sender, EventArgs e)
{
Session["cname"] = "WebUserControl2.ascx";
addcontrol();
}

void addcontrol()
{
Control uc = LoadControl(Session["cname"].ToString());


Panel1.Controls.Clear();
Panel1.Controls.Add(uc);

}

protected void Button3_Click(object sender, EventArgs e)
{
Response.Write((Panel1.Controls[0].Controls[0] as Button).Text);
}
--------------------------------------------------------------------------------------
WebUserControl1.ascx
html:

<asp:Button ID="Button1" runat="server" Text="b1" onclick="Button1_Click"
Width="158px" />

cs:

protected void Page_Load(object sender, EventArgs e)
{
Button1.Text = "第一个:1";

}

protected void Button1_Click(object sender, EventArgs e)
{
Button1.Text = "第一个:2";
}
-----------------------------------------------------------------------------------------

WebUserControl2.ascx
html:
<asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />

cs:

protected void Page_Load(object sender, EventArgs e)
{
Button1.Text = "第二个:1";

}

protected void Button1_Click(object sender, EventArgs e)
{
Button1.Text = "第二个:2";
}
-----------------------------------------------------------------------------------------
为什么交替显示后,控件里面的按钮要点两次才能相应,而且用户控件里按钮的Text 总是获取不到
...全文
40 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
likevs 2012-01-05
  • 打赏
  • 举报
回复
protected void Page_Load(object sender, EventArgs e)
{

if (!Page.IsPostBack)
{
Session["cname"] = "WebUserControl1.ascx";

}
addcontrol();

}

//改为
protected void Page_Load(object sender, EventArgs e)
{

if (!Page.IsPostBack)
{
Session["cname"] = "WebUserControl1.ascx";
addcontrol();

}

}

//试下,其它先不变
caomin9989 2012-01-04
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 likevs 的回复:]
protected void Page_Load(object sender, EventArgs e)
{

if (!Page.IsPostBack)
{
Session["cname"] = "WebUserControl1.ascx";//这里,页面第一次加载时会执行一次

}
addcontrol();//但是这里,页面第一次加载或者你点击当前……
[/Quote]
你说的很对,我也知道
我之所以这样做,如果不在Page_load中重新加载,我在按钮事件中将获取不到自定义控件中的内容,
我也知道我的代码有问题,
就是想请教一下问题出在哪里呢
likevs 2011-12-31
  • 打赏
  • 举报
回复
protected void Page_Load(object sender, EventArgs e)
{

if (!Page.IsPostBack)
{
Session["cname"] = "WebUserControl1.ascx";//这里,页面第一次加载时会执行一次

}
addcontrol();//但是这里,页面第一次加载或者你点击当前页面上的任何按钮,它都会再次执行一次,
//比如你点击WebUserControl2.ascx用户控件里的那个按钮的protected void Button1_Click(object sender, EventArgs e)事件,则页面在回调时,照样会先执行addcontrol();一次,才接着去执行protected void Button1_Click(object sender, EventArgs e)事件
}


//再来分析一下你的这个动态加载控件的方法
void addcontrol()
{
Control uc = LoadControl(Session["cname"].ToString());


Panel1.Controls.Clear();//注意这里,你每次调用这个方法时,都会清空Panel1容器里的控件哦,所以,你的Panel1容器永远只有一个子控件
Panel1.Controls.Add(uc);

}


//然后我们再来看看你的这个取Panel1容器里的子控件的方法:

protected void Button3_Click(object sender, EventArgs e)
{
Response.Write((Panel1.Controls[0].Controls[0] as Button).Text);//正如我上面所提到的,你添加控件时,每次都先清空旧子控件,则Panel1容器里实际上只有一个子控件,你现在Panel1.Controls[0].Controls[0]怎么可能取得到对象?
}


//建议楼主先理解
protected void Page_Load(object sender, EventArgs e)
这个事件是无论如何都会被再次执行的,无论是第一次还是点击按钮回调什么的,反正请求服务器,服务器需要重新构造页面对象(就是要给网民看的网页),它都会执行,除非用了缓存,
//而且你要清楚,是先执行Page_Load事件,才后面执行Button3_Click这种点击事件的,别把顺序搞乱了

//如果你理解了它们的执行顺序后,请楼主自己从头到尾地在脑海里模仿一下你的代码,一步步执行下去,就明白为什么代码有问题了
csover8 2011-12-31
  • 打赏
  • 举报
回复
加载控件页面,,跟控件页面的button命名...最好不一样.. 试试看..
caomin9989 2011-12-31
  • 打赏
  • 举报
回复
就没有高手帮忙吗

62,041

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧