天天看點

多個UpdatePanel控件互相引發重新整理的使用

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事件中加入下面的代碼:

            Label1.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">

                    <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>

                    <br />

                    <asp:Button ID="Button1" runat="server" OnClick="Button1_Click1" Text="更新兩個UpdatePanel" />

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

                    <asp:Label ID="Label2" runat="server" Text="Label"></asp:Label>

五、兩個UpdatePanel控件,其中一個UpdatePanel内的控件引發另一個UpdatePanel控件的重新整理,而本身不重新整理。

    a.步驟和上面的(四)一樣

    b.把UpdatePanel1和UpdatePanel2的ChildrenAsTriggers屬性設為false

    c.在UpdatePanel2控件中加入一個觸發器,觸發源設到UpdatePanel1控件内的Button1的Click事件上。

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

                    <asp:AsyncPostBackTrigger ControlID="Button1" EventName="Click" />

在開發過程中難免會用到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: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>

    在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:Label ID="lblOut" runat="server" Width="158px"></asp:Label>

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

                            <asp:Label ID="lblIn" runat="server" Width="148px"></asp:Label>

                    <asp:AsyncPostBackTrigger ControlID="Button1" EventName="Click" />

    在按鈕的Click事件中和(一)中的一樣。

       把兩個UpdatePanel控件的UpdateMode屬性設為Conditional,要把内部控件ChildrenAsTrigger設為 True。但這樣内部UpdatePanel内的控件隻引發自身的重新整理,不會引發外部的UpdatePanel控件的重新整理,不會重新整理外部的 UpdatePanel控件,是以我們還需要為外部UpdatePanel控件加入一個觸發器,觸發源指定為Button1控件的Click事件上。

三、兩個嵌套的UpdatePanel控件,外部的UpdatePanel内的控件回發隻引發内部控件的更新

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

                    <asp:Button ID="Button1" runat="server" OnClick="Button1_Click2" Text="Button" /><br />

                            <asp:Label ID="lblIn" runat="server" Width="148px"></asp:Label> 

                        <Triggers>

                            <asp:AsyncPostBackTrigger ControlID="Button1" EventName="Click" />

                        </Triggers>

           在按鈕的Click事件中和(一)中的一樣。

        要把兩個UpdatePanel控件的UpdateMode設為Conditional,把外部UpdatePanel控件的 ChildrenAsTrigger設為false。這樣兩個UpdatePanel控件都不會重新整理,是以還要為内部的UpdatePanel控件建立觸 發器,觸發源指向外部UpdatePanel中的的Button1的Click事件上。

四、母版頁中使用UpdatePanel控件

    如果将ScriptManager控件添加在母版頁上的話,那麼各内容頁面就沒必要再添加ScriptManager控件了,隻需添加UpdatePanel控件就可以了,因為母版頁和内容頁面将來生成的是一個頁面的執行個體,而在一個頁面上是不允許同時存在兩個ScriptManager控件的。

    如果ScriptManager控件沒有添加在母版頁上的話,那隻能把ScriptManager控件添加在其中一個内容頁面裡。不要向每一個内容頁面中添加ScriptManager控件。

    1、内容頁面中的UpdatePanel内的控件引起回發,隻更新目前内容頁面的内容。

        此時按鈕分别在各自的UpdatePanel控件内。

        将兩個内容頁面内的兩個UpdatePanel控件的UpdateMode設為Conditional,ChildrenAsTrigger設為True。

        在按鈕的Click事件中和(一)中的一樣。

        這樣就出現各内容頁的UpdatePanel内的按鈕隻對目前内容頁起作用。

    2、在母版頁中的按鈕引起回發,更新指定内容頁的資訊。

       此時有兩個按鈕:ButtonOuter在母版頁中,ButtonInner在内容頁面1中。

       當點選ButtonOuter時,異步更新兩個内容頁面的資訊。當點選ButtonInner時,異步更新母版面中的UpdatePanel1中的資訊。

       母版頁HTML代碼如下:

       <div>

     母版頁3<asp:ScriptManager ID="ScriptManager1" runat="server">

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

         <ContentTemplate>

             <asp:Label ID="lbl" runat="server" Text="Label"></asp:Label>

         </ContentTemplate>

     </asp:UpdatePanel>

      <br />

     <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="ButtonOuter" /><br />

     #####################################################################

     <table width=90%>

            <tr>

                <td bgcolor=blue>

        <asp:contentplaceholder id="ContentPlaceHolder1" runat="server">

        </asp:contentplaceholder>

                </td>

                <td bgcolor=maroon>

                    <asp:ContentPlaceHolder ID="ContentPlaceHolder2" runat="server">

                    </asp:ContentPlaceHolder>

            </tr>

        </table>

        <br />

        </div>

       内容頁面的HTML代碼如下:

       <%@ Page Language="C#" MasterPageFile="~/MasterPage3.master" AutoEventWireup="true" CodeFile="Child3.aspx.cs" Inherits="Child3" Title="Untitled Page" %>

        <%@ MasterType VirtualPath="~/MasterPage3.master" %>

        <asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">

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

                    <asp:Label ID="Label1" runat="server" Font-Bold="True" ForeColor="White" Text="Label"></asp:Label>

            <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="ButtonInner" />

        </asp:Content>

        <asp:Content ID="Content2" runat="server" ContentPlaceHolderID="ContentPlaceHolder2">

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

                    <asp:Label ID="Label2" runat="server" Font-Bold="True" ForeColor="White" Text="Label"></asp:Label>

        </asp:Content> 

       母版頁的CS代碼如下:

        protected void Page_Load(object sender, EventArgs e)

            ScriptManager1.RegisterAsyncPostBackControl(this.Button1);

            Label lbl1 = (Label)this.ContentPlaceHolder1.FindControl("Label1");

            lbl1.Text = DateTime.Now.ToString();

            Label lbl2 = (Label)this.ContentPlaceHolder2.FindControl("Label2");

            lbl2.Text = DateTime.Now.ToString();

        public string TitleInfo

            get

            {

                return lbl.Text;

            }

            set

                lbl.Text = value;

       内容頁面的CS代碼如下:

        protected void Button1_Click(object sender, EventArgs e)

            Label1.Text = Master.TitleInfo;

            Master.TitleInfo = "ContentPage1's Action";

            ((UpdatePanel)Master.FindControl("UpdatePanel1")).Update(); ;

五、使用者控件中使用UpdatePanel控件

    如果父頁面中存在ScriptManager控件,那使用者控件的頁面中不應再放入ScriptManager控件了,隻在使用者控件中加入UpdatePanel。

    其控件的回發與更新規律與使用方式與母版頁一樣。 

繼續閱讀