前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >多个UpdatePanel控件相互引发刷新的使用

多个UpdatePanel控件相互引发刷新的使用

作者头像
全栈程序员站长
发布2022-09-15 14:56:17
7610
发布2022-09-15 14:56:17
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

ScriptManager和UpdatePanel控件联合使用可以实现页面异步局部更新的效果。其中的UpdatePanel就是设置页面中异 步局部更新区域,它必须依赖于ScriptManager存在,因为ScriptManger控件提供了客户端脚本生成与管理UpdatePanel的功 能。 几个重要的属性: ScriptManager控件的EnablePartialRendering属性:true-实现页面的异步局部更新;false-实现全页面的刷新。 UpdatePanel控件的RenderMode属性:InLine-UpdatePanel控件被解析成HTML的<span>标记;Block-UpdatePanel控件被解析成HTML控件的<DIV>。 UpdatePanel控件的UpdateMode属性:Always-UpdatePanel页面上任何一处发生的回发操作都会产生页局部更新;Conditional-只在特定的情况下才产页面的回发,如执行UpdatePanel控件的update()方法或在指定的触发器的操作下。 UpdatePanel控件的ChildAsTrigger属性:指示UpdatePanel内部控件引起的回发是否产生当前UpdatePanel控件的局部更新。如果UpdateMode设为Always的话,那ChildAsTrigger局性必须设为True,否则运行出错。 一、UpdatePanel内部的控件引起的回发,来更新当前UpdatePanel内部的控件内容: 1.向页面中加入ScriptManager、UpdatePanel控件和一个Label控件(Label2)。 2.在UpdatePanel中加入一个Button、一个Label(Label1)。 3.双击Button在事件处理程序中写入下列代码:Label1.Text = DateTime.Now.ToString(); 4.在Page_Load事件中写入下列代码:Label2.Text = DateTime.Now.ToString(); 5.运行页面,发现每次点击按钮都会产生异步局步刷新,只有Label1的内容发生更改,页面上的Label2时间没有发生更改。 代码如下: <asp:Label ID=”Label2″ runat=”server” Text=”Label”></asp:Label> <asp:ScriptManager ID=”ScriptManager1″ runat=”server”> </asp:ScriptManager> <asp:UpdatePanel ID=”UpdatePanel1″ runat=”server” ChildrenAsTriggers=”True”> <ContentTemplate> <asp:Label ID=”Label1″ runat=”server”></asp:Label> <br /> <asp:Button ID=”Button1″ runat=”server” OnClick=”Button1_Click” Text=”Button” /> </ContentTemplate> </asp:UpdatePanel> protected void Button1_Click(object sender, EventArgs e) { Label1.Text = DateTime.Now.ToString(); ; } protected void Page_Load(object sender, EventArgs e) { Label2.Text = DateTime.Now.ToString(); } 注意:此时的ScriptManager的EnablePartialRendering属性应设为true。UpdatePanel的UpdateMode属性应设为Always。ChildAsTrigger属性应设为true。 二、UpdatePanel控件外部的控件引起的回发,来异步更新UpdatePanel内部的内容: 虽然上面的方式能够很简单地实现异步局部更新的功能,但就性能方面考虑,我们应当只将数据确实会发生变化的控件摆放在UpdatePanel中,这就可能会出现引起回发的控件不在UpdatePanel内的情况。 有两种方式实现这种效果: a.在Page_Load方法中用ScriptManager1.RegisterAsyncPostBackControl()来注册一下要实现异步更新的控件。 b.用触发器来实现。 1、ScriptManager1.RegisterAsyncPostBackControl()注册的控件可以实现对所有的UpdatePanel控件的异步更新。 如:ScriptManager1.RegisterAsyncPostBackControl(this.Button2);实现对Button2的注 册,那此时Button2的回发就变成一个异步回发(页面不会刷新),它会导致页面上所有的UpdatePanel的内容的更新。 注意:此时的ScriptManager的EnablePartialRendering属性应设为true。UpdatePanel的UpdateMode属性应设为Always。 2、ScriptManager1.RegisterAsyncPostBackControl()注册的控件可以实现针对特定UpdatePanel控件的异步更新。 a.把页面上所有的UpdatePanel控件的UpdateMode设为Conditional。 b.ScriptManager1.RegisterAsyncPostBackControl(this.Button2);实现对Button2的注册。 c.在Button2控件的Click事件中后面加入后面的代码:UpdatePanel1.Update(); 这样Button2按钮只对UpdatePanel1控件实现的异步的局部刷新。 注意:这里的UpdatePanel的属性要设为Conditional,如果还是Always的话,会出现所有的UpdatePanel都刷新的效果。 3、触发器 如果页面上有多个UpdatePanel控件,如果要实现外部的控件的回发引发指定UpdatePanel的更新的话,那应当为要实现刷新的UpdatePanel控件建立一个触发器。 a.选中要进行局部更新的UpdatePanel控件。 b.在其属性页中点击Triggers集合属性右边的小按钮。 c.在弹出的对话框中,的成员列表中添加一个AsyncPostBackTriggers成员。 d.指定AsyncPostBackTriggers成员的ControlID和EventName,即引发异步回送的控件的ID和该控件的事件。 完成以上步骤后,切换到HTML页面就会出现下列代码: <asp:UpdatePanel ID=”UpdatePanel2″ runat=”server” RenderMode=”Inline” UpdateMode=”Conditional”> <ContentTemplate> <asp:Label ID=”Label3″ runat=”server” Text=”Label”></asp:Label> </ContentTemplate> <Triggers> <asp:AsyncPostBackTrigger ControlID=”Button2″ EventName=”Click” /> </Triggers> </asp:UpdatePanel> <asp:Button ID=”Button2″ runat=”server” OnClick=”Button2_Click” Text=”ButtonOut” /> 这里需要大家注意的是: 把所有的UpdatePanel控件的UpdateMode设为”Conditional”,这样才能够针对建有相关触发器的UpdatePanel更新。 一个UpdatePanel上可以建有多个触发器,实现在不同的情况下对该UpdatePanel控件内容的更新。 三、两个UpdatePanel控件,其中一个UpdatePanel内的控件引发两个UpdatePanel控件的同时刷新。 a.在页面上放入两个UpdatePanel和一个ScriptManager控件。 b.在UpdatePanel1中加入一个标签Label1、一个按钮Button1 ,在UpdatePanel2中加入一个标签Label2。 c.将UpdatePanel1和UpdatePanel2两个控件的的UpdateMode属性设为”Always” c.在Button1的Click事件中加入下面的代码: protected void Button1_Click(object sender, EventArgs e) { Label1.Text = DateTime.Now.ToString(); Label2.Text = DateTime.Now.ToString(); } 四、两个UpdatePanel控件,其中一个UpdatePanel内的控件引发当前的UpdatePanel控件的刷新,而另一个不刷新。 a.步骤和上面的(三)一样 b.要把UpdatePanel1和UpdatePanel2两个控件的UpdateMode属性设为Conditional <asp:ScriptManager ID=”ScriptManager1″ runat=”server”> </asp:ScriptManager> <asp:UpdatePanel ID=”UpdatePanel1″ runat=”server” UpdateMode=”Conditional”> <ContentTemplate> <asp:Label ID=”Label1″ runat=”server” Text=”Label”></asp:Label> <br /> <asp:Button ID=”Button1″ runat=”server” OnClick=”Button1_Click1″ Text=”更新两个UpdatePanel” /> </ContentTemplate> </asp:UpdatePanel> <asp:UpdatePanel ID=”UpdatePanel2″ runat=”server” UpdateMode=”Conditional”> <ContentTemplate> <asp:Label ID=”Label2″ runat=”server” Text=”Label”></asp:Label> </ContentTemplate> </asp:UpdatePanel> 五、两个UpdatePanel控件,其中一个UpdatePanel内的控件引发另一个UpdatePanel控件的刷新,而本身不刷新。 a.步骤和上面的(四)一样 b.把UpdatePanel1和UpdatePanel2的ChildrenAsTriggers属性设为false c.在UpdatePanel2控件中加入一个触发器,触发源设到UpdatePanel1控件内的Button1的Click事件上。 <asp:ScriptManager ID=”ScriptManager1″ runat=”server”> </asp:ScriptManager> <asp:UpdatePanel ID=”UpdatePanel1″ runat=”server” UpdateMode=”Conditional” ChildrenAsTriggers=”False”> <ContentTemplate> <asp:Label ID=”Label1″ runat=”server” Text=”Label”></asp:Label> <br /> <asp:Button ID=”Button1″ runat=”server” OnClick=”Button1_Click1″ Text=”更新两个UpdatePanel” /> </ContentTemplate> </asp:UpdatePanel> <asp:UpdatePanel ID=”UpdatePanel2″ runat=”server” UpdateMode=”Conditional”> <ContentTemplate> <asp:Label ID=”Label2″ runat=”server” Text=”Label”></asp:Label> </ContentTemplate> <Triggers> <asp:AsyncPostBackTrigger ControlID=”Button1″ EventName=”Click” /> </Triggers> </asp:UpdatePanel> 在开发过程中难免会用到UpdatePanel控件的一些复杂的使用。如:UpdatePanel控件的嵌套、在母版页中使用UpdatePanel、在用户控件中使用UpdatePanel以及在GridView中使用UpdatePanel等。 其实这些操作也免不了对UpdatePanel控件的UpdateMode属性、ChildrenAsTrigger属性以及触发器的使用,下面是系统地说明。 一、两个嵌套的UpdatePanel控件,外部的UpdatePanel内的控件回发引发二者同时更新 在页面上放一个ScriptManager和UpdatePanel控件(UpdatePanel1),在UpdatePanel1中放入一个标签控件 (lblOut)、一个按钮(Button1)和另一个UpdatePanel控件(UpdatePanel2),在UpdatePanel2控件中放一 个标签控件lblIn。 <asp:ScriptManager ID=”ScriptManager1″ runat=”server”> </asp:ScriptManager> <asp:UpdatePanel ID=”UpdatePanel1″ runat=”server” UpdateMode=”Conditional”> <ContentTemplate> <asp:Label ID=”lblOut” runat=”server”></asp:Label> <asp:Button ID=”Button1″ runat=”server” OnClick=”Button1_Click2″ Text=”Button” /> <asp:UpdatePanel ID=”UpdatePanel2″ runat=”server” UpdateMode=”Conditional”> <ContentTemplate> <asp:Label ID=”lblIn” runat=”server”></asp:Label> </ContentTemplate> </asp:UpdatePanel> </ContentTemplate> </asp:UpdatePanel> 在Button1控件中的Click事件中加入下面的代码: protected void Button1_Click2(object sender, EventArgs e) { lblIn.Text = DateTime.Now.ToString(); lblOut.Text = DateTime.Now.ToString(); } 要实现外部UpdatePanel内控件的回发引起内部和外部两个UpdatePanel控件的同时刷新的话,需要把两个UpdatePanel控件的 UpdateMode都设为Conditional,这样外部UpdatePanel内的控件回发会自动引起内部UpdatePanel控件的刷新。 注意: 外 部UpdatePanel控件的ChildrenAsTrigger属性要设为True,两个UpdatePanel控件的UpdateMode要都设为 Conditional,如果UpdateMode设为Always的话也会出现两个UpdatePanel同时刷新的效果,但样这会导致页面上其它的 UpdatePanel控件也发生刷新。 二、两个嵌套的UpdatePanel控件,内部的UpdatePanel内的控件回发引发二者同时更新 在页面上放一个ScriptManager和UpdatePanel控件(UpdatePanel1),在UpdatePanel1中放入一个标签控件 (lblOut)和另一个UpdatePanel控件(UpdatePanel2),在UpdatePanel2控件中放一个标签控件lblIn和一个按 钮(Button1)。 <asp:ScriptManager ID=”ScriptManager1″ runat=”server”> </asp:ScriptManager> <asp:UpdatePanel ID=”UpdatePanel1″ runat=”server” UpdateMode=”Conditional”> <ContentTemplate> <asp:Label ID=”lblOut” runat=”server” Width=”158px”></asp:Label> <br /> <asp:UpdatePanel ID=”UpdatePanel2″ runat=”server” UpdateMode=”Conditional”> <ContentTemplate> <asp:Label ID=”lblIn” runat=”server” Width=”148px”></asp:Label> <asp:Button ID=”Button1″ runat=”server” OnClick=”Button1_Click2″ Text=”Button” /> </ContentTemplate> </asp:UpdatePanel> </ContentTemplate> <Triggers> <asp:AsyncPostBackTrigger ControlID=”Button1″ EventName=”Click” /> </Triggers> </asp:UpdatePanel> 在按钮的Click事件中和(一)中的一样。 注意: 把两个UpdatePanel控件的UpdateMode属性设为Conditional,要把内部控件ChildrenAsTrigger设为 True。但这样内部UpdatePanel内的控件只引发自身的刷新,不会引发外部的UpdatePanel控件的刷新,不会刷新外部的 UpdatePanel控件,因此我们还需要为外部UpdatePanel控件加入一个触发器,触发源指定为Button1控件的Click事件上。

对我有用[1] 丢个板砖[0] 引用 | 举报 | 编辑 删除 管理

u010479137 gongshunkai3 本版等级: 本版专家分:75 结帖率:87.5%

#6 得分:0 回复于: 2013-10-18 00:24:20

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/163538.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档