Asp.net移动开发指南(7)
自定义ASP.NET移动控件
除了使用内置的ASP.NET移动控件集以外,开发人员还可以创建自己的控件,封装自定义功能以便在移动Web窗体页面上重复使用这些功能。创建自定义ASP.NET移动控件,可以轻松跨越ASP.NET移动Web应用程序,来划分和重复使用公共用户界面(UI)功能。通过为自定义移动控件提供对象模型支持,用户控件能提供比ASP.NET服务器控件更大的灵活性。ASP.NET允许创建两种控件:
· 用户控件。在.ascx文件中,开发Web控件为应用程序创建可以重复使用的自定义控件。
· 自定义控件。创建直接从MobileControl类继承的原始ASP.NET移动控件。这种方式赋予用户更大的灵活性。
1.5.1 用户控件
ASP.NET移动用户控件提供了一种快速高效的方法,使得开发人员可以在ASP.NET移动页面上创建自己的用户控件。开发人员可以将一个或多个移动控件按照相关逻辑进行组合,并将它们封装到一个用户控件中。通过这种方式,可以在移动页面中重复使用该自定义的用户控件。
创建用户控件时,需要使用与用于页的声明性标记语法相同的语法,只是创建的是.ascx文件扩展名而不是.aspx文件扩展名。与ASP.NET移动Web窗体页类似,移动用户控件文件必须包含一些标准的头指令,表示它是移动控件,如以下代码所示。
这些指令与移动页的指令非常类似,只是用@Control指令代替了@Page指令。@ Register指令将别名与命名空间和类关联,以便可以在用户控件中声明标准的移动控件。在WebUserControl.ascx.vb文件中,Inherits属性指向System.Web.UI.MobileControls. MobileUser Control类。清单1-15中的示例演示在一个用户控件中使用多个标签显示一位客户的详细信息。该用户控件在移动设备上运行时,Pocket PC设备屏幕上将显示一位客户编号、姓名、住址和联系电话。
清单1-15 显示客户详细信息的用户控件
移动用户控件创建之后,有以下两种方法来部署控件:使用@Register指令注册控件或者使用LoadControl方法,以编程方式将控件加载到移动Web页面上。使用@Register指令注册控件,通常操作就是在设计时,从Visual Studio 2005解决方案资源管理器中直接将用户控件文件拖至Web窗体上即可实现。以下代码演示如何使用@Register指令注册控件。
除了@Register指令,还可以使用LoadControl方法,以编程方式将控件加载到Web页面上。如清单1-16代码所示。图1-11显示了清单1-16所示用户控件的运行时Web界面。
清单1-16 使用LoadControl方法以编程方式加载用户控件
图1-11 用户控件的运行时Web界面
在清单1-16中,Label控件都是使用MobileControls,而不是WebControls。代码中通过用户控件中的子控件ID查找访问子控件,但是在实际开发中不建议使用这种方法访问用户控件中的子控件。通常的做法是为用户控件声明属性。为用户控件声明属性的代码如清单1-17所示。
清单1-17 使用LoadControl方法以编程方式加载用户控件
1.5.2 自定义控件
开发人员可以创建完全自定义的ASP.NET移动控件。编写自己的控件可以提供最大的灵活性。自定义移动控件的开发必须遵循以下基本原则:
· 编写自己的移动控件时,应使它从MobileControl基类继承,而不是从ASP.NET Control类继承。MobileControl基类继承了ASP.NET Control类中确保成功开发无线设备所需的所有适用功能。
· 编写自己的控件时,应使代码本身独立于设备。
· 对每种要求不同的控件呈现类型的设备类型,应编写特定于设备的适配器。
· 设计可重复使用的代码,以便其他开发人员可以继承控件的属性和方法。
创建自定义控件时,可以使用下列常规技术:
· 继承。通过从现有移动控件类继承来编写控件,并添加自定义属性、方法、事件或行为。
· 复合。通过组合现有移动控件来编写复合控件。
· 从头开始编写。编写直接从System.Web.UI.MobileControl类继承的控件,并提供自定义的控件功能和行为。
前两项技术(继承和复合)相当简单。使用复合控件可以通过组合现有的控件来创作新控件,复合控件等效于用户控件。复合控件和用户控件之间的主要区别是,用户控件以.ascx文本文件的形式存在,而复合控件编译后被保存在程序集文件(.dll)中。
从头开始编写的方法比较难,因为System.Web.UI.MobileControl是所有ASP.NET移动控件的基类,主要包括移动控件通用的样式和上下文信息,而需要开发人员为控件自定义针对设备的特定行为。
1.5.3 通过继承扩展控件功能
除了用户控件外,还可以使用继承技术来扩展ASP.NET移动Web应用程序的功能。如果创建从现有ASP.NET移动控件类继承的类,则可以通过重写现有成员或通过为新类创建新属性、方法和事件,将自定义的额外功能和行为附加到现有移动控件上,并同时依赖被继承的控件进行呈现和交互。通过继承移动控件可以完成的任务包括:
· 预定义控件的样式和其他属性。
· 添加更丰富的数据绑定行为。
· 处理控件自己的事件,生成更高级的事件或自动更新数据。
为了演示使用继承在现有移动控件之上生成自定义行为,清单1-18中的示例演示创建一个从List控件类继承而来的Menu控件。该Menu控件根据当前页上的窗体生成菜单,并提供菜单自己的命令处理功能,处理命令的同时导航到选定的窗体。
清单1-18 从List控件类继承而来的Menu控件
清单1-18中的MyMenu类编译之后形成一个DLL程序集文件。通过Visual Studio 2005,可以从该DLL程序集文件里将继承得到的MyMenu控件添加到工具箱上。工具箱上的MyMenu控件如图19-12所示。
当使用MyMenu控件时,可以从工具箱上直接将MyMenu控件拖至移动Web窗体上。就像使用标准的ASP.NET移动控件一样。
http://hi.baidu.com/zhiwei%5F117/blog/item/3cf4571e550dfb00304e1508.html
除了使用内置的ASP.NET移动控件集以外,开发人员还可以创建自己的控件,封装自定义功能以便在移动Web窗体页面上重复使用这些功能。创建自定义ASP.NET移动控件,可以轻松跨越ASP.NET移动Web应用程序,来划分和重复使用公共用户界面(UI)功能。通过为自定义移动控件提供对象模型支持,用户控件能提供比ASP.NET服务器控件更大的灵活性。ASP.NET允许创建两种控件:
· 用户控件。在.ascx文件中,开发Web控件为应用程序创建可以重复使用的自定义控件。
· 自定义控件。创建直接从MobileControl类继承的原始ASP.NET移动控件。这种方式赋予用户更大的灵活性。
1.5.1 用户控件
ASP.NET移动用户控件提供了一种快速高效的方法,使得开发人员可以在ASP.NET移动页面上创建自己的用户控件。开发人员可以将一个或多个移动控件按照相关逻辑进行组合,并将它们封装到一个用户控件中。通过这种方式,可以在移动页面中重复使用该自定义的用户控件。
创建用户控件时,需要使用与用于页的声明性标记语法相同的语法,只是创建的是.ascx文件扩展名而不是.aspx文件扩展名。与ASP.NET移动Web窗体页类似,移动用户控件文件必须包含一些标准的头指令,表示它是移动控件,如以下代码所示。
+展开
<%@ Control Language="VB" AutoEventWireup="false" CodeFile="WebUserControl.ascx.vb" Inherits="WebUserControl" %>
<%@ Register TagPrefix="mobile" Namespace="System.Web.UI.MobileControls" Assembly="System.Web.Mobile" %>
-HTML
<%@ Control Language="VB" AutoEventWireup="false" CodeFile="WebUserControl.ascx.vb" Inherits="WebUserControl" %>
<%@ Register TagPrefix="mobile" Namespace="System.Web.UI.MobileControls" Assembly="System.Web.Mobile" %>
这些指令与移动页的指令非常类似,只是用@Control指令代替了@Page指令。@ Register指令将别名与命名空间和类关联,以便可以在用户控件中声明标准的移动控件。在WebUserControl.ascx.vb文件中,Inherits属性指向System.Web.UI.MobileControls. MobileUser Control类。清单1-15中的示例演示在一个用户控件中使用多个标签显示一位客户的详细信息。该用户控件在移动设备上运行时,Pocket PC设备屏幕上将显示一位客户编号、姓名、住址和联系电话。
清单1-15 显示客户详细信息的用户控件
+展开
-HTML
<%@ Control Language="VB" AutoEventWireup="false" CodeFile="WebUserControl.ascx.vb" Inherits="WebUserControl" %>
<%@ Register TagPrefix="mobile" Namespace="System.Web.UI.MobileControls" Assembly="System.Web.Mobile" %>
客户编号:<mobile:Label ID="lblCustID" Runat="server"></mobile:Label>
客户姓名:<mobile:Label ID="lblCustName" Runat="server"></mobile:Label>
客户住址:<mobile:Label ID="lblCustAddr" Runat="server"></mobile:Label>
联系电话:<mobile:Label ID="lblCustPhone" Runat="server"></mobile:Label>
<%@ Register TagPrefix="mobile" Namespace="System.Web.UI.MobileControls" Assembly="System.Web.Mobile" %>
客户编号:<mobile:Label ID="lblCustID" Runat="server"></mobile:Label>
客户姓名:<mobile:Label ID="lblCustName" Runat="server"></mobile:Label>
客户住址:<mobile:Label ID="lblCustAddr" Runat="server"></mobile:Label>
联系电话:<mobile:Label ID="lblCustPhone" Runat="server"></mobile:Label>
移动用户控件创建之后,有以下两种方法来部署控件:使用@Register指令注册控件或者使用LoadControl方法,以编程方式将控件加载到移动Web页面上。使用@Register指令注册控件,通常操作就是在设计时,从Visual Studio 2005解决方案资源管理器中直接将用户控件文件拖至Web窗体上即可实现。以下代码演示如何使用@Register指令注册控件。
+展开
-HTML
<%@ Register Src="WebUserControl.ascx" TagName="WebUserControl" TagPrefix="uc1" %>
……
<body>
<mobile:Form id="Form1" runat="server">
<uc1:WebUserControl ID="MyWebUserControl" runat="server" />
</mobile:Form>
</body>
……
<body>
<mobile:Form id="Form1" runat="server">
<uc1:WebUserControl ID="MyWebUserControl" runat="server" />
</mobile:Form>
</body>
除了@Register指令,还可以使用LoadControl方法,以编程方式将控件加载到Web页面上。如清单1-16代码所示。图1-11显示了清单1-16所示用户控件的运行时Web界面。
清单1-16 使用LoadControl方法以编程方式加载用户控件
+展开
-VBScript
'……
' 使用 LoadControl 方法
Dim CarCtl As WebUserControl = CType(LoadControl("WebUserControl.ascx"), WebUserControl)
Form1.Controls.Add(CarCtl)
' 用户控件处理代码
Dim lblCustID As MobileControls.Label = _
CType(CarCtl.FindControl("lblCustID"), MobileControls.Label)
lblCustID.Text = "100001"
Dim lblCustName As MobileControls.Label = _
CType(CarCtl.FindControl("lblCustName"), MobileControls.Label)
lblCustName.Text = "曹孟德"
Dim lblCustAddr As MobileControls.Label = _
CType(CarCtl.FindControl("lblCustAddr"), MobileControls.Label)
lblCustAddr.Text = "安徽亳县"
Dim lblCustPhone As MobileControls.Label = _
CType(CarCtl.FindControl("lblCustPhone"), MobileControls.Label)
lblCustPhone.Text = "0551-2296666"
'……
' 使用 LoadControl 方法
Dim CarCtl As WebUserControl = CType(LoadControl("WebUserControl.ascx"), WebUserControl)
Form1.Controls.Add(CarCtl)
' 用户控件处理代码
Dim lblCustID As MobileControls.Label = _
CType(CarCtl.FindControl("lblCustID"), MobileControls.Label)
lblCustID.Text = "100001"
Dim lblCustName As MobileControls.Label = _
CType(CarCtl.FindControl("lblCustName"), MobileControls.Label)
lblCustName.Text = "曹孟德"
Dim lblCustAddr As MobileControls.Label = _
CType(CarCtl.FindControl("lblCustAddr"), MobileControls.Label)
lblCustAddr.Text = "安徽亳县"
Dim lblCustPhone As MobileControls.Label = _
CType(CarCtl.FindControl("lblCustPhone"), MobileControls.Label)
lblCustPhone.Text = "0551-2296666"
'……
图1-11 用户控件的运行时Web界面
在清单1-16中,Label控件都是使用MobileControls,而不是WebControls。代码中通过用户控件中的子控件ID查找访问子控件,但是在实际开发中不建议使用这种方法访问用户控件中的子控件。通常的做法是为用户控件声明属性。为用户控件声明属性的代码如清单1-17所示。
清单1-17 使用LoadControl方法以编程方式加载用户控件
+展开
-VBScript
Private _CustName As MobileControls.Label = Nothing
Public Property CustName() As MobileControls.Label
Get
Return _CustName
End Get
Set(ByVal value As MobileControls.Label)
_CustName = value
End Set
End Property
Public Property CustName() As MobileControls.Label
Get
Return _CustName
End Get
Set(ByVal value As MobileControls.Label)
_CustName = value
End Set
End Property
1.5.2 自定义控件
开发人员可以创建完全自定义的ASP.NET移动控件。编写自己的控件可以提供最大的灵活性。自定义移动控件的开发必须遵循以下基本原则:
· 编写自己的移动控件时,应使它从MobileControl基类继承,而不是从ASP.NET Control类继承。MobileControl基类继承了ASP.NET Control类中确保成功开发无线设备所需的所有适用功能。
· 编写自己的控件时,应使代码本身独立于设备。
· 对每种要求不同的控件呈现类型的设备类型,应编写特定于设备的适配器。
· 设计可重复使用的代码,以便其他开发人员可以继承控件的属性和方法。
创建自定义控件时,可以使用下列常规技术:
· 继承。通过从现有移动控件类继承来编写控件,并添加自定义属性、方法、事件或行为。
· 复合。通过组合现有移动控件来编写复合控件。
· 从头开始编写。编写直接从System.Web.UI.MobileControl类继承的控件,并提供自定义的控件功能和行为。
前两项技术(继承和复合)相当简单。使用复合控件可以通过组合现有的控件来创作新控件,复合控件等效于用户控件。复合控件和用户控件之间的主要区别是,用户控件以.ascx文本文件的形式存在,而复合控件编译后被保存在程序集文件(.dll)中。
从头开始编写的方法比较难,因为System.Web.UI.MobileControl是所有ASP.NET移动控件的基类,主要包括移动控件通用的样式和上下文信息,而需要开发人员为控件自定义针对设备的特定行为。
1.5.3 通过继承扩展控件功能
除了用户控件外,还可以使用继承技术来扩展ASP.NET移动Web应用程序的功能。如果创建从现有ASP.NET移动控件类继承的类,则可以通过重写现有成员或通过为新类创建新属性、方法和事件,将自定义的额外功能和行为附加到现有移动控件上,并同时依赖被继承的控件进行呈现和交互。通过继承移动控件可以完成的任务包括:
· 预定义控件的样式和其他属性。
· 添加更丰富的数据绑定行为。
· 处理控件自己的事件,生成更高级的事件或自动更新数据。
为了演示使用继承在现有移动控件之上生成自定义行为,清单1-18中的示例演示创建一个从List控件类继承而来的Menu控件。该Menu控件根据当前页上的窗体生成菜单,并提供菜单自己的命令处理功能,处理命令的同时导航到选定的窗体。
清单1-18 从List控件类继承而来的Menu控件
+展开
-VBScript
Imports Microsoft.VisualBasic
Public Class MyMenu : Inherits System.Web.UI.MobileControls.List
Protected Overrides Sub OnLoad(ByVal e As EventArgs)
If (Not Page.IsPostBack) Then
MyBase.OnLoad(e)
Dim thisForm As MobileControls.Form = Form
Dim testForm As MobileControls.Form
For Each testForm In MobilePage.Forms
If (Not (testForm Is thisForm)) Then
Dim item As MobileControls.MobileListItem = _
New MobileControls.MobileListItem()
Dim formTitle As String = testForm.Title
If (formTitle.Length > 0) Then
item.Text = formTitle
Else
item.Text = testForm.ID
End If
item.Value = testForm.UniqueID
Items.Add(item)
End If
Next
End If
AddHandler Me.ItemCommand, AddressOf Me.HandleCommand
End Sub
Protected Sub HandleCommand(ByVal sender As Object, _
ByVal e As MobileControls.ListCommandEventArgs)
Dim ctl As MobileControls.Form = _
CType(MobilePage.FindControl(e.ListItem.Value), MobileControls.Form)
If (Not (ctl Is Nothing)) Then
MobilePage.ActiveForm = ctl
End If
End Sub
End Class
Public Class MyMenu : Inherits System.Web.UI.MobileControls.List
Protected Overrides Sub OnLoad(ByVal e As EventArgs)
If (Not Page.IsPostBack) Then
MyBase.OnLoad(e)
Dim thisForm As MobileControls.Form = Form
Dim testForm As MobileControls.Form
For Each testForm In MobilePage.Forms
If (Not (testForm Is thisForm)) Then
Dim item As MobileControls.MobileListItem = _
New MobileControls.MobileListItem()
Dim formTitle As String = testForm.Title
If (formTitle.Length > 0) Then
item.Text = formTitle
Else
item.Text = testForm.ID
End If
item.Value = testForm.UniqueID
Items.Add(item)
End If
Next
End If
AddHandler Me.ItemCommand, AddressOf Me.HandleCommand
End Sub
Protected Sub HandleCommand(ByVal sender As Object, _
ByVal e As MobileControls.ListCommandEventArgs)
Dim ctl As MobileControls.Form = _
CType(MobilePage.FindControl(e.ListItem.Value), MobileControls.Form)
If (Not (ctl Is Nothing)) Then
MobilePage.ActiveForm = ctl
End If
End Sub
End Class
清单1-18中的MyMenu类编译之后形成一个DLL程序集文件。通过Visual Studio 2005,可以从该DLL程序集文件里将继承得到的MyMenu控件添加到工具箱上。工具箱上的MyMenu控件如图19-12所示。
当使用MyMenu控件时,可以从工具箱上直接将MyMenu控件拖至移动Web窗体上。就像使用标准的ASP.NET移动控件一样。
http://hi.baidu.com/zhiwei%5F117/blog/item/3cf4571e550dfb00304e1508.html
加支付宝好友偷能量挖...