ASP.NET AJAX入门系列:使用UpdatePanel控件(二)

翻译|其它|编辑:郝浩|2007-09-11 11:06:44.000|阅读 753 次

概述:

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

UpdatePanel  可以用来创建丰富的局部更新  Web  应用程序,它是  ASP.NET 2.0 AJAX Extensions  中很重要的一个控件,其强大之处在于不用编写任何客户端脚本,只要在一个页面上添加几个  UpdatePanel  控件和一个  ScriptManager  控件就可以自动实现局部更新。通过本文来学习一下  UpdatePanel  其他的一些使用方法(第二篇)。

主要内容

1.用编程的方法控制  UpdatePanel  的更新

2UpdatePanel  的嵌套使用

3.同一页面上使用多个  UpdatePanel 

一.用编程的方法控制  UpdatePanel  的更新

对于  UpdatePanel,我们也可以使用编程的方法来控制它的更新,可以通过  ScriptManager  RegisterAsyncPostBackControl()方法注册一个异步提交的控件,并且调用  UpdatePanel    Update()方法来让它更新。再次用我在前面的文章中用到的一个无聊的时间更新例子来看一下,有时候我觉得例子过于复杂更加不好说明白所要讲的内容,如下代码所示,注意  Button1并不包含在  UpdatePanel  中:

<% @ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<script runat="server">
    
void Button1_Click(object sender, EventArgs e)
    
{
        
this.Label2.Text = DateTime.Now.ToString();
    }
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    
<title>Refreshing an UpdatePanel Programmatically</title>
</head>
<body>
    
<form id="form1" runat="server">
        
<asp:ScriptManager ID="ScriptManager1" runat="server"/>
        
<div>
            
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
                
<ContentTemplate>
                    
<asp:Label ID="Label1" runat="server" Text="
更新时间:"></asp:Label>
                    
<asp:Label ID="Label2" runat="server" Text="Label" ForeColor="Red"></asp:Label><br/><br/>                     
                
</ContentTemplate>
            
</asp:UpdatePanel>
             
<asp:Button ID="Button1" runat="server" Text="Button"  OnClick = "Button1_Click"/>
        
</div>
    
</form>
</body>
</html>

这时候不用多说,肯定是整页提交了,运行如下图所示:

 

再次修改上面的例子,使用  ScriptManager    RegisterAsyncPostBackControl()注册  Button1为一个异步提交控件,并且调用  UpdatePanel    Update()方法:

<% @ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<script runat="server">
    
void Page_Load(object sender, EventArgs e)
    
{
        ScriptManager1.RegisterAsyncPostBackControl(Button1);
    }

    void Button1_Click(object sender, EventArgs e)
    
{
        
this.Label2.Text = DateTime.Now.ToString();
        
this.UpdatePanel1.Update();
    }
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    
<title>Refreshing an UpdatePanel Programmatically</title>
</head>
<body>
    
<form id="form1" runat="server">
        
<asp:ScriptManager ID="ScriptManager1" runat="server"/>
        
<div>
            
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
                
<ContentTemplate>
                    
<asp:Label ID="Label1" runat="server" Text="更新时间:"></asp:Label>
                    
<asp:Label ID="Label2" runat="server" Text="Label" ForeColor="Red"></asp:Label><br/><br/>                     
                
</ContentTemplate>
            
</asp:UpdatePanel>
             
<asp:Button ID="Button1" runat="server" Text="Button"  OnClick = "Button1_Click"/>
        
</div>
    
</form>
</body>
</html>

这时候可以看到,已经是异步提交了:

 

二. UpdatePanel的嵌套使用

UpdatePanel  还可以嵌套使用,即在一个  UpdatePanel    ContentTemplate  中还可以放入另一个  UpdatePanel。当最外面的  UpdatePanel  被触发更新时,它里面的子  UpdatePanel  也随着更新,里面的  UpdatePanel  触发更新时,只更新它自己,而不会更新外层的  UpdatePanel。看下面的例子:

<% @ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" %>
<script runat="server">
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    
<title>UpdatePanelUpdateMode Example</title>
    
<style type="text/css">
    div.NestedPanel
    
{ }{
      position
: relative;
      margin
: 2% 5% 2% 5%;
    
}
    
</style>
</head>
<body>
    
<form id="form1" runat="server">
        
<div>
            
<asp:ScriptManager ID="ScriptManager" 
                               runat
="server" />
            
<asp:UpdatePanel ID="OuterPanel" 
                             UpdateMode
="Conditional" 
                             runat
="server">
                
<ContentTemplate>
                    
<div>
                        
<fieldset>
                            
<legend>Outer Panel </legend>
                            
<br />
                            
<asp:Button ID="OPButton1" 
                                        Text
="Outer Panel Button" 
                                        runat
="server" />
                            
<br />
                            Last updated on
                            <%= DateTime.Now.ToString() %>
                            
<br />
                            
<br />
                            
<asp:UpdatePanel ID="NestedPanel1" 
                                               UpdateMode
="Conditional"
                                               runat
="server">
                                
<ContentTemplate>
                                    
<div class="NestedPanel">
                                        
<fieldset>
                                            
<legend>Nested Panel 1</legend>
                                            
<br />
                                            Last updated on
                                            <%= DateTime.Now.ToString() %>
                                            
<br />
                                            
<asp:Button ID="NPButton1"
                                                        Text
="Nested Panel 1 Button" 
                                                        runat
="server" />
                                        
</fieldset>
                                    
</div>
                                
</ContentTemplate>
                            
</asp:UpdatePanel>
                        
</fieldset>
                    
</div>
                
</ContentTemplate>
            
</asp:UpdatePanel>
        
</div>
    
</form>
</body>
</html>

运行后如下:

 

三.同一页面上使用多个  UpdatePanel

使用  UpdatePanel  的时候并没有限制在一个页面上用多少个  UpdatePanel,所以我们可以为不同的需要局部更新的页面区域加上不同的  UpdatePanel。由于  UpdatePanel  默认的  UpdateMode    Always,如果页面上有一个局部更新被触发,则所有的  UpdatePanel  都将更新,这是我们不愿看到的,我们只需要  UpdatePanel  在它自己的触发器触发的时候更新就可以了,所以需要把  UpdateMode  设置为  Conditional

来看一下官方网站上提供的一个例子:包括两个  UpdatePanel,其中一个用来用户输入而另一个则用来显示数据,每一个  UpdatePanel    UpdateMode  属性都设置为  Conditional。当我们单击  Cancel  按钮时,只有用来用户输入的那个  UpdatePanel  刷新,当单击  Insert  按钮时,两个  UpdatePanel  都刷新。代码如下:

<% @ Page Language="C#" %>
<%
@ Import Namespace="System.Collections.Generic" %>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
    
<title>Enter New Employees</title>
    
<script runat="server">
        private List<Employee> EmployeeList;
        protected 
void Page_Load()
        
{
            
if (!IsPostBack)
            
{
                EmployeeList =
 new List<Employee>();
                EmployeeList.Add(
new Employee(1, "Jump", "Dan"));
                EmployeeList.Add(
new Employee(2, "Kirwan", "Yvette"));
                ViewState["EmployeeList"] = EmployeeList;
            }
            
else
                EmployeeList = (List<Employee>)ViewState["EmployeeList"];
            
            EmployeesGridView.DataSource = EmployeeList;
            EmployeesGridView.DataBind();
        }
        
        protected 
void InsertButton_Click(object sender, EventArgs e)
        
{
            
if (String.IsNullOrEmpty(FirstNameTextBox.Text) ||
               String.IsNullOrEmpty(LastNameTextBox.Text)) 
return; }
            
int employeeID = EmployeeList[EmployeeList.Count-1].EmployeeID + 1;
            string lastName = Server.HtmlEncode(FirstNameTextBox.Text);
            string firstName = Server.HtmlEncode(LastNameTextBox.Text);
            FirstNameTextBox.Text = String.Empty;
            LastNameTextBox.Text = String.Empty;
            EmployeeList.Add(
new Employee(employeeID, lastName, firstName));
            ViewState["EmployeeList"] = EmployeeList;
            EmployeesGridView.DataBind();
            EmployeesGridView.PageIndex = EmployeesGridView.PageCount;
        }
        protected 
void CancelButton_Click(object sender, EventArgs e)
        
{
            FirstNameTextBox.Text = String.Empty;
            LastNameTextBox.Text = String.Empty;
        }
        [Serializable]
        public class Employee
        
{
            private 
int _employeeID;
            private string _lastName;
            private string _firstName;
            public 
int EmployeeID
            
{
                get 
return _employeeID; }
            }
            public string LastName
            
{
                get 
return _lastName; }
            }
            public string FirstName
            
{
                get 
return _firstName; }
            }
            public Employee(
int employeeID, string lastName, string firstName)
            
{
                _employeeID = employeeID;
                _lastName = lastName;
                _firstName = firstName;
            }
        }
    
</script>
</head>
<body>
    
<form id="form1" runat="server">
    
<div>
        
&nbsp;</div>
        
<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePartialRendering="true" />
        
<table>
            
<tr>
                
<td style="height: 206px" valign="top">
                    
<asp:UpdatePanel ID="InsertEmployeeUpdatePanel" runat="server" UpdateMode="Conditional">
                        
<ContentTemplate>
                          
<table cellpadding="2" border="0" style="background-color:#7C6F57">
                            
<tr>
                              
 ID="FirstNameLabel" runat="server" AssociatedControlID=

                                  "FirstNameTextBox" 
                                             Text
="First Name" ForeColor="White" /></td>
                              
<td><asp:TextBox runat="server" ID="FirstNameTextBox" /></td>
                            
</tr>
                            
<tr>
                              
 ID="LastNameLabel" runat="server" AssociatedControlID=

                                  "LastNameTextBox" 
                                             Text
="Last Name" ForeColor="White" /></td>
                              
<td><asp:TextBox runat="server" ID="LastNameTextBox" /></td>
                            
</tr>
                            
<tr>
                              
<td></td>
                              
<td>
                                
<asp:LinkButton ID="InsertButton" runat="server" Text="Insert"

                                    OnClick="InsertButton_Click" ForeColor="White" />
                                
<asp:LinkButton ID="Cancelbutton" runat="server" Text="Cancel" 

                                    OnClick="CancelButton_Click" ForeColor="White" />
                              
</td>
                            
</tr>
                          
</table>
                          
<asp:Label runat="server" ID="InputTimeLabel"><%=DateTime.Now %></asp:Label>
                        
</ContentTemplate>
                    
</asp:UpdatePanel>
                
</td>
                
<td style="height: 206px" valign="top">
                    
<asp:UpdatePanel ID="EmployeesUpdatePanel" runat="server" UpdateMode="Conditional">
                        
<ContentTemplate>
                            
<asp:GridView ID="EmployeesGridView" runat="server" BackColor="LightGoldenrodYellow" 

                               BorderColor="Tan" BorderWidth="1px" CellPadding="2" ForeColor="Black" GridLines="None" 

                               AutoGenerateColumns="False">
                                
<FooterStyle BackColor="Tan" />
                                
<SelectedRowStyle BackColor="DarkSlateBlue" ForeColor="GhostWhite" />
                                
<PagerStyle BackColor="PaleGoldenrod" ForeColor="DarkSlateBlue" 

                                    HorizontalAlign="Center" />
                                
<HeaderStyle BackColor="Tan" Font-Bold="True" />
                                
<AlternatingRowStyle BackColor="PaleGoldenrod" />
                                
<Columns>
                                    
<asp:BoundField DataField="EmployeeID" HeaderText="Employee ID" />
                                    
<asp:BoundField DataField="LastName" HeaderText="Last Name" />
                                    
<asp:BoundField DataField="FirstName" HeaderText="First Name" />
                                
</Columns>
                                
<PagerSettings PageButtonCount="5" />
                            
</asp:GridView>
                            
<asp:Label runat="server" ID="ListTimeLabel"><%=DateTime.Now %></asp:Label>
                        
</ContentTemplate>
                        
<Triggers>
                            
<asp:AsyncPostBackTrigger ControlID="InsertButton" EventName="Click" />
                        
</Triggers>
                    
</asp:UpdatePanel>
                
</td>
            
</tr>
        
</table>
    
</form>
</body>
</html>

运行后效果如下:


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com

文章转载自:csdn

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP