1 / 24

第八章

第八章. 用户控件与自定义控件. 用户控件与自定义控件. 用户控件 自定义控件 复合控件. 用户控件. ASP.NET 用户控件与 ASP.NET Web 窗体文件类似,同时具有用户界面页和代码。用户控件可以像 Web 窗体一样包含对其内容进行操作的代码。 不过,用户控件与 ASP.NET 窗体还有存在一些区别: 用户控件的文件扩展名为 .ascx ,而不是 .aspx 。 用户控件中没有 @Page 指令,而是包含 @Control 指令,该指令对配置及其他属性进行定义。 用户控件不能作为独立文件运行。而必须像处理任何控件一样,将它们添加到 ASP.NET 窗体中。

trilby
Download Presentation

第八章

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第八章 用户控件与自定义控件

  2. 用户控件与自定义控件 • 用户控件 • 自定义控件 • 复合控件

  3. 用户控件 • ASP.NET用户控件与ASP.NET Web窗体文件类似,同时具有用户界面页和代码。用户控件可以像Web窗体一样包含对其内容进行操作的代码。 • 不过,用户控件与ASP.NET窗体还有存在一些区别: • 用户控件的文件扩展名为.ascx,而不是.aspx。 • 用户控件中没有@Page指令,而是包含@Control指令,该指令对配置及其他属性进行定义。 • 用户控件不能作为独立文件运行。而必须像处理任何控件一样,将它们添加到ASP.NET窗体中。 • 用户控件中没有html、body或form元素。这些元素必须位于宿主页中。

  4. 创建用户控件 • 创建用户控件时,需要创建一个新的.ascx文件。 • ascx页面的顶部有一个@ Control指令,并指定要为控件编程使用的语言。接下来,可以添加希望用户控件显示的控件,通常是ASP.NET内置的Web服务器控件或者HTML控件。 • 当然,在控件中创建相应的属性,可以在用户控件和宿主页之间共享信息。根据需要创建任何类的属性,可以创建为公共成员或使用get和set访问器创建属性。

  5. 【例 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"/>

  6. 【例 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; } }

  7. 【例 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. 【例 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 (); }

  9. 【例 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 (); }

  10. 使用用户控件 • 若要使用用户控件,应该将用户控件包含在ASP.NET网页中。 • 在Web窗体页中包括用户控件通常包括如下步骤: • 在包含ASP.NET网页中,创建一个@Register指令,在其中包括一个TagPrefix属性,该属性将前缀与用户控件相关联;一个TagName属性,用于指示用户控件名称;以及一个Src属性,用于表示用户控件文件的虚拟路径。 • 在网页窗体中,在form元素内部声明用户控件元素。 • 通过属性表或者代码设置用户控件公开的公共属性。

  11. 【例 8‑2】 <uc1:SpinControlID="SpinControl1"runat = "server"MaxValue = "10"MinValue = "1"/>

  12. 将Web窗体转换用户控件 • 很多情况下,创建用户控件的最简便的方法是先将用户控件设计成独立的Web窗体页,然后对其运行测试,测试成功之后再将其转换成用户控件。不过,在转换过程中还需要注意以下几点: • 将.aspx扩展名改为.ascx。 • 从该页面中移除html、body和form元素。 • 将@ Page指令更改为@ Control指令。 • 在@ Control指令中只保留Language、AutoEventWireup、CodeFile和Inherits属性。 • 在@ Control指令中包含className属性。这允许将用户控件添加到页面时对其进行强类型化。

  13. 自定义控件 • 所有的ASP.NET控件都是从System.Web.UI.Control或者System.Web.UI.WebControls.WebControl这两个类派生而来。从Control类派生的类具有Page框架所需的基本功能。 • 从WebControl派生的类除了具有Control类提供的功能之外,还添加了许多创建能够呈现可视化HTML控件的通用功能。 • 自定义服务器控件与用户控件类似,可以包含很多类;但是,它们之间的根本区别在于自定义服务器控件使用预编译的程序集,而不是使用包含在组件内的代码。

  14. 【例 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); } }

  15. HtmlTextWriter类的主要方法

  16. 使用自定义控件 • 如果在App_Code目录中包含自定义服务器控件的源代码,如上例中的MyCustomControl.cs文件,可以使用ASP.NET动态编译功能直接在Web窗体页中使用控件,而无需将控件编译为程序集。 • ASP.NET能动态编译ASP.NET网站根目录下App_Code目录中放置的代码。这样就可以从窗体页访问App_Code中源文件中的类,而无需将其手动编译为程序集。

  17. 【例 8‑4】 <%@RegisterNamespace="MyCC"TagPrefix="CC1" %> <CC1:MyCC1id="myCControl1"runat=server>Hello, World</CC1:MyCC1>

  18. 添加到工具箱 • 将自定义控件添加到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

  19. 添加到工具箱 • 为程序集嵌入图标 • 对于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

  20. 添加到工具箱 • 将程序集添加到工具箱中 • 在VWD的工具箱中点击右键,选择“选择项”。在“选择工具箱项”对话框中点击“浏览”按钮,找到刚才编译生成的DLL文件。 • 点击“确定”按钮。此时,将在工具箱中添加一个控件按钮。这样,我们就可以像使用ASP.NET内置控件一样的使用自定义控件,直接将其拖放到Web窗体中。

  21. 复合控件 • 本章前面部分已经讲解了自定义控件的创建和使用,但是我们只是针对单个的HTML控件。这对于实际需要来说是远远不够的。 • 真正有效的控件通常需要将多个HTML元素嵌套在一起。ASP.NET允许程序员创建可以包含其他控件的容器,这种类型的控件就是复合控件。

  22. 【例 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; }

  23. 【例 8‑5】 privatevoid _button_Click (object source, EventArgs e) { Text = "Hello, World"; } publicstring Text { get { EnsureChildControls (); return textbox.Text; } set { EnsureChildControls (); textbox.Text = value; } } }

  24. 【例 8‑5】 <%@RegisterNamespace="WebControlLibrary1"TagPrefix="CC1" %> …… <CC1:WebCustomControl2ID="myCompositeControl1"runat="server"/>

More Related