240 likes | 396 Views
第八章. 用户控件与自定义控件. 用户控件与自定义控件. 用户控件 自定义控件 复合控件. 用户控件. ASP.NET 用户控件与 ASP.NET Web 窗体文件类似,同时具有用户界面页和代码。用户控件可以像 Web 窗体一样包含对其内容进行操作的代码。 不过,用户控件与 ASP.NET 窗体还有存在一些区别: 用户控件的文件扩展名为 .ascx ,而不是 .aspx 。 用户控件中没有 @Page 指令,而是包含 @Control 指令,该指令对配置及其他属性进行定义。 用户控件不能作为独立文件运行。而必须像处理任何控件一样,将它们添加到 ASP.NET 窗体中。
E N D
第八章 用户控件与自定义控件
用户控件与自定义控件 • 用户控件 • 自定义控件 • 复合控件
用户控件 • ASP.NET用户控件与ASP.NET Web窗体文件类似,同时具有用户界面页和代码。用户控件可以像Web窗体一样包含对其内容进行操作的代码。 • 不过,用户控件与ASP.NET窗体还有存在一些区别: • 用户控件的文件扩展名为.ascx,而不是.aspx。 • 用户控件中没有@Page指令,而是包含@Control指令,该指令对配置及其他属性进行定义。 • 用户控件不能作为独立文件运行。而必须像处理任何控件一样,将它们添加到ASP.NET窗体中。 • 用户控件中没有html、body或form元素。这些元素必须位于宿主页中。
创建用户控件 • 创建用户控件时,需要创建一个新的.ascx文件。 • ascx页面的顶部有一个@ Control指令,并指定要为控件编程使用的语言。接下来,可以添加希望用户控件显示的控件,通常是ASP.NET内置的Web服务器控件或者HTML控件。 • 当然,在控件中创建相应的属性,可以在用户控件和宿主页之间共享信息。根据需要创建任何类的属性,可以创建为公共成员或使用get和set访问器创建属性。
【例 8‑1】 <%@ControlLanguage="C#"AutoEventWireup = "true"CodeFile="SpinControl.ascx.cs"Inherits = "SpinControl" %> <asp:TextBoxID="textNumber"runat = "server"ReadOnly="True"Width="32px"Enabled="False"/> <asp:ButtonFont-Bold="True"ID = "buttonUp"runat="server"Text="^"OnClick="buttonUp_Click"Width="21px"/> <asp:ButtonFont-Bold="True"ID = "buttonDown"runat="server"Text="v"OnClick="buttonDown_Click"Width="20px"/>
【例 8‑1】 privateint m_minValue; privateint m_maxValue = 100; privateint m_currentNumber = 0; publicint MinValue { get { return m_minValue; } set { if (value >= this.MaxValue) thrownewException ("MinValue必须小于MaxValue。"); else m_minValue = value; } }
【例 8‑1】 publicint MaxValue { get { return m_maxValue; } set { if (value <= this.MinValue) thrownewException ("MaxValue必须大于MinValue。"); else m_maxValue = value; } } publicint CurrentNumber { get { return m_currentNumber; } }
【例 8‑1】 void DisplayNumber () { textNumber.Text = CurrentNumber.ToString (); ViewState["currentNumber"] = CurrentNumber.ToString (); } void Page_Load (object sender, EventArgs e) { if (IsPostBack) m_currentNumber = Int16.Parse (ViewState["currentNumber"].ToString ()); else m_currentNumber = this.MinValue; DisplayNumber (); }
【例 8‑1】 void buttonUp_Click (object sender, EventArgs e){ if (m_currentNumber == this.MaxValue) m_currentNumber = this.MinValue; else m_currentNumber += 1; DisplayNumber (); } void buttonDown_Click (object sender, EventArgs e) { if (m_currentNumber == this.MinValue) m_currentNumber = this.MaxValue; else m_currentNumber -= 1; DisplayNumber (); }
使用用户控件 • 若要使用用户控件,应该将用户控件包含在ASP.NET网页中。 • 在Web窗体页中包括用户控件通常包括如下步骤: • 在包含ASP.NET网页中,创建一个@Register指令,在其中包括一个TagPrefix属性,该属性将前缀与用户控件相关联;一个TagName属性,用于指示用户控件名称;以及一个Src属性,用于表示用户控件文件的虚拟路径。 • 在网页窗体中,在form元素内部声明用户控件元素。 • 通过属性表或者代码设置用户控件公开的公共属性。
【例 8‑2】 <uc1:SpinControlID="SpinControl1"runat = "server"MaxValue = "10"MinValue = "1"/>
将Web窗体转换用户控件 • 很多情况下,创建用户控件的最简便的方法是先将用户控件设计成独立的Web窗体页,然后对其运行测试,测试成功之后再将其转换成用户控件。不过,在转换过程中还需要注意以下几点: • 将.aspx扩展名改为.ascx。 • 从该页面中移除html、body和form元素。 • 将@ Page指令更改为@ Control指令。 • 在@ Control指令中只保留Language、AutoEventWireup、CodeFile和Inherits属性。 • 在@ Control指令中包含className属性。这允许将用户控件添加到页面时对其进行强类型化。
自定义控件 • 所有的ASP.NET控件都是从System.Web.UI.Control或者System.Web.UI.WebControls.WebControl这两个类派生而来。从Control类派生的类具有Page框架所需的基本功能。 • 从WebControl派生的类除了具有Control类提供的功能之外,还添加了许多创建能够呈现可视化HTML控件的通用功能。 • 自定义服务器控件与用户控件类似,可以包含很多类;但是,它们之间的根本区别在于自定义服务器控件使用预编译的程序集,而不是使用包含在组件内的代码。
【例 8‑3】 publicclassMyCC1 : Label { [Bindable (true)] [Category ("Appearance")] [DefaultValue ("")] [Localizable (true)] overridepublicstring Text { get { String s = (String) ViewState["Text"]; return ((s == null) ? String.Empty : s); } set { ViewState["Text"] = value;} } protectedoverridevoid RenderContents (HtmlTextWriter output) { output.Write (Text); } }
使用自定义控件 • 如果在App_Code目录中包含自定义服务器控件的源代码,如上例中的MyCustomControl.cs文件,可以使用ASP.NET动态编译功能直接在Web窗体页中使用控件,而无需将控件编译为程序集。 • ASP.NET能动态编译ASP.NET网站根目录下App_Code目录中放置的代码。这样就可以从窗体页访问App_Code中源文件中的类,而无需将其手动编译为程序集。
【例 8‑4】 <%@RegisterNamespace="MyCC"TagPrefix="CC1" %> <CC1:MyCC1id="myCControl1"runat=server>Hello, World</CC1:MyCC1>
添加到工具箱 • 将自定义控件添加到VWD工具箱的步骤如下: • 首先,将自定义控件的源代码编译为程序集,根据不同的程序设计语言,其编译命令如下: • 对于C#语言: csc /t:library /out:MyCC.dll /r:System.dll /r:System.Web.dll *.cs • 对于VB语言: vbc /t:library /out:MyCC.dll /r:System.dll /r:System.Web.dll *.vb
添加到工具箱 • 为程序集嵌入图标 • 对于C#: csc /res:图标文件名 /t:library /out:输出程序集文件名 /r:System.dll /r:System.Web.dll *.cs • 对于VB: csc /res:图标文件名 /t:library /out:输出程序集文件名 /r:System.dll /r:System.Web.dll *.vb
添加到工具箱 • 将程序集添加到工具箱中 • 在VWD的工具箱中点击右键,选择“选择项”。在“选择工具箱项”对话框中点击“浏览”按钮,找到刚才编译生成的DLL文件。 • 点击“确定”按钮。此时,将在工具箱中添加一个控件按钮。这样,我们就可以像使用ASP.NET内置控件一样的使用自定义控件,直接将其拖放到Web窗体中。
复合控件 • 本章前面部分已经讲解了自定义控件的创建和使用,但是我们只是针对单个的HTML控件。这对于实际需要来说是远远不够的。 • 真正有效的控件通常需要将多个HTML元素嵌套在一起。ASP.NET允许程序员创建可以包含其他控件的容器,这种类型的控件就是复合控件。
【例 8‑5】 publicclassWebCustomControl2 : CompositeControl { protectedTextBox textbox = newTextBox (); protectedButton button = newButton (); protectedoverridevoid CreateChildControls () { this.Controls.Add (textbox); this.Controls.Add (button); button.Text = "确定"; button.Click += newEventHandler (_button_Click); this.ChildControlsCreated = true; }
【例 8‑5】 privatevoid _button_Click (object source, EventArgs e) { Text = "Hello, World"; } publicstring Text { get { EnsureChildControls (); return textbox.Text; } set { EnsureChildControls (); textbox.Text = value; } } }
【例 8‑5】 <%@RegisterNamespace="WebControlLibrary1"TagPrefix="CC1" %> …… <CC1:WebCustomControl2ID="myCompositeControl1"runat="server"/>