.net 流氓
天下无难事,有志者成之;天下无易事,有恒者得之。

UpdatePanel的使用方法

UpdatePanel控件也是Ajax里用得最多的控件之一,UpdatePanel控件是用来局部更新网页上的内容,网页上要局部更新的内容必须放在UpdatePanel控件里,他必须和ScriptManager控件一起使用。现在来看UpdatePanel的属性

UpdatePanel重要的属性如下:

属性 说明
ChildrenAsTriggers 当UpdateMode属性为Conditional时,UpdatePanel中的子控件的异步回送是否会引发UpdatePanle的更新。
RenderMode 表示UpdatePanel最终呈现的HTML元素。Block(默认)表示<div>,Inline表示<span>

UpdateMode

表示UpdatePanel的更新模式,有两个选项:Always和Conditional。Always是不管有没有Trigger,其他控件都将更新该UpdatePanel,Conditional表示只有当前UpdatePanel的Trigger,或ChildrenAsTriggers属性为true时当前UpdatePanel中控件引发的异步回送或者整页回送,或是服务器端调用Update()方法才会引发更新该UpdatePanel。

ChildrenAsTriggers:当UpdateMode属性为Conditional时,UpdatePanel中的子控件的异步回送是否会引发UpdatePanle的更新。

RenderMode:表示UpdatePanel最终呈现的HTML元素。Block(默认)表示<div>,Inline表示<span> 。

UpdateMode:表示UpdatePanel的更新模式,有两个选项:Always和Conditional。Always是不管有没有Trigger,其他控件都将更新该UpdatePanel,Conditional表示只有当前UpdatePanel的Trigger,或ChildrenAsTriggers属性为true时当前UpdatePanel中控件引发的异步回送或者整页回送,或是服务器端调用Update()方法才会引发更新该UpdatePanel。

Contente Template:用来定义UpdatePanel的内容。

Triggers:分别为AsyncPostBackTrigger和PostBackTrigger。在下面会做详细介绍。

UpdateMode属性确定了在何种条件下渲染一个UpdatePanel的内容。默认地,这个属性设置为Always,指示每一次回送时都要渲染内容,而不论回送源自于哪个控件。

UpdatePanel更合适的设置是Conditional,这指示ScriptManager只有在满足以下某个条件时才应当渲染一个UpdatePanel的内容:

1.该UpdatePanel的一个子控件调用了一个回送。

2.调用了一个注册触发器(如点击UpdatePanel外的一个按钮)。

3.调用了UpdatePanel的Update方法。

例子:

<asp:ScriptManager ID="ScriptManager1" runat="server">

</asp:ScriptManager>

<asp:UpdatePanel ID="UpdatePanel1" runat="server" >

<ContentTemplate>

<% =DateTime.Now.ToString()%>

<asp:Button ID="Button1" runat="server" Text="UpdatePanelButton" />

</ContentTemplate>

</asp:UpdatePanel>

<asp:UpdatePanel ID="UpdatePanel2" runat="server" UpdateMode="Conditional">

    <ContentTemplate>

<% =DateTime.Now.ToString()%>

<asp:Button ID="Button2" runat="server" Text="AnotherUpdatePanelButton" />

</ContentTemplate>

</asp:UpdatePanel>

点击Button1(UpdateMode设置为Always的UpdatePanel)后,此时只会更新该面板(UpdatePanel1)中的内容。由于已经把第二个面板的UpdateMode设置为Conditional,第二个面板中的内容不会更新,因为未满足上述三个条件。

提示 将UpdateMode属性设置为Always应当作为动态更新某个区域的最后的选择。UpdatePanel最关键的就是要减少由服务器下传的数据量,即只传递需要更新的部分内容。不要把这个属性设置为Always,而应该养成习惯从一开始就设置为Conditional,只是在适合的情况下才使用Always。UpdateMode属性默认设置为Always,以便为创建者提供一种开箱即用(out-of-the-box)式开发体验。

如果点击第二个面板(UpdateMode设置为Conditional)中的按钮,注意两个面板中的内容都会更新。之所以会出现这种情况,原因在于回送是由第二个面板中的子控件调用的(满足条件一)。由于第一个面板的更新模式设置为Always,所以每次回送时它都会更新。

下面介绍下updatePanel的触发器Trigger
了解数据库的人应该对触发器这个概念比较清楚,Trigger对于UpdatePanel来说也是很关键的,这里用例子大概稍微深入地介绍下:
1.普通回调触发器(PostBackTrigger)
PostBackTrigger用来指定在UpdatePanel中的某个服务端控件,它所引发的回送不使用异步回送,而仍然是传统的整页回送
下面是简单例子:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" %>
<!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>
</div>
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Always">
<ContentTemplate>
<% =DateTime.Now.ToString()%>
<asp:Button ID="Button1" runat="server" Text="UpdatePanelButton" />
</ContentTemplate>
<Triggers>
<!--下面的注释掉,点击updatePanel内的button则只更新Panel内的时间,取消注释责全部更新-->
<!-- <asp:PostBackTrigger ControlID="Button1"/>-->
</Triggers>
</asp:UpdatePanel>
<br />
<% =DateTime.Now.ToString()%>
<asp:Button ID="Button2" runat="server" Text="Button" />
</form>
</body>
</html>

2.异步回调触发器(AsyncPostBackTrigger)
AsyncPostBackTrigge用来指定某个服务器端控件以及其将触发的服务器端事件作为该UpdatePanel的异步更新触发器,它需要设置的属性有控件ID和服务端控件的事件。

例:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" %>
<!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">
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Always">
<ContentTemplate>
<% =DateTime.Now.ToString()%>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="Button2" EventName="Click" />
</Triggers>
</asp:UpdatePanel>
<br />
<% =DateTime.Now.ToString()%>
<asp:Button ID="Button2" runat="server" Text="Button" />
</form>
</body>
</html>

运行了发现点击button2的时候只更新了 updatepanel内部的时间。

稍复杂一点的例子:

<form id="form1" runat="server">

    <div>

        <asp:ScriptManager ID="ScriptManager1" runat="server">

        </asp:ScriptManager>        

      <fieldset>

            <legend class="UpdatePanelTitle">UpdatePanel控件外</legend>

            <asp:Button runat="server" ID="Button5" Text="引发常规回传" /><br />

            <asp:Button runat="server" ID="Button1" Text="引发异步回传" /><br />        

             Refrest at <%=DateTime.Now.ToUniversalTime()%>

        </fieldset>

         <br /><br />

        <asp:UpdatePanel ID="UpdatePanel1" UpdateMode="Conditional" runat="server">

        <Triggers>

        <asp:PostBackTrigger ControlID ="Button2" />

        </Triggers>

        <ContentTemplate>        

        <fieldset>

        <legend class="UpdatePanelTitle">UpdatePanel1</legend>

        <asp:Button runat="server" ID="Button2" Text="引发常规回传" />

        Refresh at <%=DateTime.Now.ToUniversalTime()%>

        </fieldset>

        </ContentTemplate>

        </asp:UpdatePanel>

        <br /><br />

        <asp:UpdatePanel ID="UpdatePanel2"  UpdateMode="Conditional" runat="server">

        <Triggers>

        <asp:AsyncPostBackTrigger ControlID="Button1" />

        </Triggers>

        <ContentTemplate>             

        <fieldset>          

        <legend class="UpdatePanelTitle">UpdatePanel2</legend>

        <asp:Button runat="server" ID="Button3" Text="InPanel2" /> 

        Refresh at <%=DateTime.Now.ToUniversalTime() %><br />

               

        <asp:UpdatePanel ID="UpdatePanel3" runat="server" UpdateMode="Always">

        <ContentTemplate>

        <fieldset>

        <legend class="UpdatePanelTitle">UpdatePanel3:I'm Child of UpdatePanel2</legend>

        <asp:Button runat="server" ID="Button4" Text="InPanel3" OnClick="Button4_Click" />

        Refresh at <%=DateTime.Now.ToUniversalTime()%>

        </fieldset>

        </ContentTemplate>

        </asp:UpdatePanel>

        </fieldset>

        </ContentTemplate>

        </asp:UpdatePanel>

         <br /><br />

        <asp:UpdatePanel ID="UpdatePanel4" UpdateMode="Conditional" runat="server" ChildrenAsTriggers="false">

        <ContentTemplate>        

        <fieldset>

        <legend class="UpdatePanelTitle">UpdatePanel4</legend>

        <asp:Button runat="server" ID="Button6" Text="引发常规回传,但不更新自己" />

        Refresh at <%=DateTime.Now.ToUniversalTime()%>

        </fieldset>

        </ContentTemplate>

        </asp:UpdatePanel>                     

        </div>

</form>

.cs文件代码:

protected void Button4_Click(object sender, EventArgs e)

{

    UpdatePanel1.Update();

}

1.点击Button5,更新UpdatePanel控件外、UpdatePanel1、UpdatePanel2、UpdatePanel3、UpdatePanel4中的内容。

2.点击Button1,只更新UpdatePanel2和UpdatePanel3中的内容(因为在UpdatePanel2中指定将Button1控件的Click事件作为该UpdatePanel的异步更新触发器; UpdatePanel3的内容会更新是因为UpdatePanel3的UpdateMode为“Always”)。

3.点击Button2,更新所有内容(因为Button2所在的UpdatePanel中将Triggers设为PostBackTrigger,即引起页面的全部更新)。

4.点击Button3, 只更新UpdatePanel2和UpdatePanel3中的内容(满足条件一)。

5.点击Button4, 只更新UpdatePanel1和UpdatePanel3中的内容。(UpdataPanel1的内容会更新是因为Button4的click事件里调用了UpdatePanel1的Update方法;UpdatePanel3的内容会更新是因为UpdatePanel3的UpdateMode为“Always”)。

6.点击Button6,只更新UpdatePanel3的内容(不会更新UpdatePanel4中的内容,因为UpdatePanel4的ChildrenAsTriggers为“false”)。

 

posted on 2011-06-27 16:25  .net 流氓  阅读(1175)  评论(0编辑  收藏  举报