⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 webctrlauthoring.aspx

📁 书籍教程 >> .Net教程 >> asp.net编程精彩百例
💻 ASPX
📖 第 1 页 / 共 3 页
字号:
<Acme:SourceRef
  RunSample="/quickstart/aspplus/samples/webforms/ctrlauth/noncomposition/CS/NonComposition2.aspx"
  ViewSource="/quickstart/aspplus/samples/webforms/ctrlauth/noncomposition/NonComposition2.src"
  Icon="/quickstart/aspplus/images/ctrlauth10.gif"
  Caption="C# NonComposition2.aspx"
  runat="server" />
  </CsTemplate>
  <VbTemplate>
<Acme:SourceRef
  RunSample="/quickstart/aspplus/samples/webforms/ctrlauth/noncomposition/VB/NonComposition2.aspx"
  ViewSource="/quickstart/aspplus/samples/webforms/ctrlauth/noncomposition/NonComposition2.src"
  Icon="/quickstart/aspplus/images/ctrlauth10.gif"
  Caption="VB NonComposition2.aspx"
  runat="server" />
  </VbTemplate>
  <JsTemplate>
<Acme:SourceRef
  RunSample="/quickstart/aspplus/samples/webforms/ctrlauth/noncomposition/JS/NonComposition2.aspx"
  ViewSource="/quickstart/aspplus/samples/webforms/ctrlauth/noncomposition/NonComposition2.src"
  Icon="/quickstart/aspplus/images/ctrlauth10.gif"
  Caption="JScript NonComposition2.aspx"
  runat="server" />
  </JsTemplate>
</Acme:LangSwitch>


<!--BEGIN SECTION-->
<p>
<a name="templated"><br> <span class="subhead">开发模板控件</span>
<p>

ASP.NET 页框架允许控件开发人员通过使用模板创作将用户界面同控件逻辑分开的控件。通过将 UI 提供为模板标记之间的参数,页面开发人员可以自定义控件的显示。
<p>
模板控件具有一个或多个类型为 <b>System.Web.UI.ITemplate</b> 的属性,如下面的示例所示。

<p><Acme:TabControl runat="server">
<Tab Name="C#">
[TemplateContainer(typeof(Template1))] public ITemplate MessageTemplate {...}
</Tab>

<Tab Name="VB">
Public Property &lt;TemplateContainer(GetType(Template1VB))&gt; MessageTemplate As ITemplate
</Tab>

<Tab Name="JScript">
TemplateContainerAttribute(Template1) function get MessageTemplate() : ITemplate
</Tab>

</Acme:TabControl><p>

属性(以上方括号中的)指定容器(父)控件的类型。
<p>
<b>ITemplate</b> 接口具有一个方法 <b>InstantiateIn</b>,该方法动态创建控件实例。这在 <b>CreateChildControls</b> 方法中的 <b>ITemplate</b> 属性上调用,如下面的示例所示。

<p><Acme:TabControl runat="server">
<Tab Name="C#">
protected override void CreateChildControls() {
    if (MessageTemplate != null) {
        MessageTemplate.InstantiateIn(this);
    }
    ...
}
</Tab>

<Tab Name="VB">
Protected Overrides Sub CreateChildControls()
    If MessageTemplate <> Null Then
        MessageTemplate.InstantiateIn(Me)
    End if
    ...
End Sub
</Tab>

<Tab Name="JScript">
override protected function CreateChildControls() : void {
    if (MessageTemplate != null) {
        MessageTemplate.InstantiateIn(this);
    }
    ...
}
</Tab>

</Acme:TabControl><p>

下面的示例显示一个简单的模板控件和使用它的 ASP.NET 页。

<p>

<Acme:LangSwitch runat="server">
  <CsTemplate>
<Acme:SourceRef
  RunSample="/quickstart/aspplus/samples/webforms/ctrlauth/templates/CS/Template1.aspx"
  ViewSource="/quickstart/aspplus/samples/webforms/ctrlauth/templates/Template1.src"
  Icon="/quickstart/aspplus/images/ctrlauth11.gif"
  Caption="C# Template1.aspx"
  runat="server" />
  </CsTemplate>
  <VbTemplate>
<Acme:SourceRef
  RunSample="/quickstart/aspplus/samples/webforms/ctrlauth/templates/VB/Template1.aspx"
  ViewSource="/quickstart/aspplus/samples/webforms/ctrlauth/templates/Template1.src"
  Icon="/quickstart/aspplus/images/ctrlauth11.gif"
  Caption="VB Template1.aspx"
  runat="server" />
  </VbTemplate>
  <JsTemplate>
<Acme:SourceRef
  RunSample="/quickstart/aspplus/samples/webforms/ctrlauth/templates/JS/Template1.aspx"
  ViewSource="/quickstart/aspplus/samples/webforms/ctrlauth/templates/Template1.src"
  Icon="/quickstart/aspplus/images/ctrlauth11.gif"
  Caption="JScript Template1.aspx"
  runat="server" />
  </JsTemplate>
</Acme:LangSwitch>


<!--BEGIN SECTION-->
<p>
<a name="templatedlist"><br> <span class="subhead">开发模板数据绑定控件</span>
<p>

下面的示例显示用模板创建数据绑定控件的更复杂应用。此示例中定义的 Repeater 控件类似于 <b>System.Web.UI.WebControls.Repeater</b> 控件。

<p>

<Acme:LangSwitch runat="server">
  <CsTemplate>
<Acme:SourceRef
  RunSample="/quickstart/aspplus/samples/webforms/ctrlauth/templates/CS/Repeater1.aspx"
  ViewSource="/quickstart/aspplus/samples/webforms/ctrlauth/templates/Repeater1.src"
  Icon="/quickstart/aspplus/images/ctrlauth12.gif"
  Caption="C# Repeater1.aspx"
  runat="server" />
  </CsTemplate>
  <VbTemplate>
<Acme:SourceRef
  RunSample="/quickstart/aspplus/samples/webforms/ctrlauth/templates/VB/Repeater1.aspx"
  ViewSource="/quickstart/aspplus/samples/webforms/ctrlauth/templates/Repeater1.src"
  Icon="/quickstart/aspplus/images/ctrlauth12.gif"
  Caption="VB Repeater1.aspx"
  runat="server" />
  </VbTemplate>
  <JsTemplate>
<Acme:SourceRef
  RunSample="/quickstart/aspplus/samples/webforms/ctrlauth/templates/JS/Repeater1.aspx"
  ViewSource="/quickstart/aspplus/samples/webforms/ctrlauth/templates/Repeater1.src"
  Icon="/quickstart/aspplus/images/ctrlauth12.gif"
  Caption="JScript Repeater1.aspx"
  runat="server" />
  </JsTemplate>
</Acme:LangSwitch>

<p>

下面的示例修改前面的示例,使页使用者可以在回发期间遍历其 Items 集合,以从中取出值。

<p>

<Acme:LangSwitch runat="server">
  <CsTemplate>
<Acme:SourceRef
  RunSample="/quickstart/aspplus/samples/webforms/ctrlauth/templates/CS/Repeater2.aspx"
  ViewSource="/quickstart/aspplus/samples/webforms/ctrlauth/templates/Repeater2.src"
  Icon="/quickstart/aspplus/images/ctrlauth13.gif"
  Caption="C# Repeater2.aspx"
  runat="server" />
  </CsTemplate>
  <VbTemplate>
<Acme:SourceRef
  RunSample="/quickstart/aspplus/samples/webforms/ctrlauth/templates/VB/Repeater2.aspx"
  ViewSource="/quickstart/aspplus/samples/webforms/ctrlauth/templates/Repeater2.src"
  Icon="/quickstart/aspplus/images/ctrlauth13.gif"
  Caption="VB Repeater2.aspx"
  runat="server" />
  </VbTemplate>
  <JsTemplate>
<Acme:SourceRef
  RunSample="/quickstart/aspplus/samples/webforms/ctrlauth/templates/JS/Repeater2.aspx"
  ViewSource="/quickstart/aspplus/samples/webforms/ctrlauth/templates/Repeater2.src"
  Icon="/quickstart/aspplus/images/ctrlauth13.gif"
  Caption="JScript Repeater2.aspx"
  runat="server" />
  </JsTemplate>
</Acme:LangSwitch>


<!--BEGIN SECTION-->
<p>
<a name="parsing"><br> <span class="subhead">重写控件分析</span>
<p>

正如在<a href="#innercontent">检索内部内容</a>中看到的,如果控件 A 在页上的其控件标记中有嵌套控件,页分析器会将那些控件的实例添加到 A 的 Controls 集合。这通过调用 A 的 <b>AddSubParsedObject</b> 方法来实现。每个控件从 <b>Control</b> 继承此方法,默认实现只不过将子控件插入到控件层次结构树中。通过重写 <b>AddSubParsedObject</b> 方法,控件可以重写默认的分析逻辑。注意,这里的讨论有些简化,下一个示例给出更多细节。
<p>
下面的示例定义重写默认分析逻辑的自定义控件 <code>CustomParse1</code>。当分析特定类型的子控件时,它将其添加到集合。<code>CustomParse1</code> 的呈现逻辑基于该集合中的项数。示例中还定义了一个简单的自定义控件 <code>Item</code>。

<p>

<Acme:LangSwitch runat="server">
  <CsTemplate>
<Acme:SourceRef
  RunSample="/quickstart/aspplus/samples/webforms/ctrlauth/customparsing/CS/CustomParse1.aspx"
  ViewSource="/quickstart/aspplus/samples/webforms/ctrlauth/customparsing/CustomParse1.src"
  Icon="/quickstart/aspplus/images/ctrlauth14.gif"
  Caption="C# CustomParse1.aspx"
  runat="server" />
  </CsTemplate>
  <VbTemplate>
<Acme:SourceRef
  RunSample="/quickstart/aspplus/samples/webforms/ctrlauth/customparsing/VB/CustomParse1.aspx"
  ViewSource="/quickstart/aspplus/samples/webforms/ctrlauth/customparsing/CustomParse1.src"
  Icon="/quickstart/aspplus/images/ctrlauth14.gif"
  Caption="VB CustomParse1.aspx"
  runat="server" />
  </VbTemplate>
  <JsTemplate>
<Acme:SourceRef
  RunSample="/quickstart/aspplus/samples/webforms/ctrlauth/customparsing/JS/CustomParse1.aspx"
  ViewSource="/quickstart/aspplus/samples/webforms/ctrlauth/customparsing/CustomParse1.src"
  Icon="/quickstart/aspplus/images/ctrlauth14.gif"
  Caption="JScript CustomParse1.aspx"
  runat="server" />
  </JsTemplate>
</Acme:LangSwitch>

<p>
<b>注意:</b>如果自定义控件是从 <b>WebControl</b> 派生的,它将不具有示例中描述的分析逻辑,因为 <b>WebControl</b> 是用 <b>ParseChildrenAttribute(ChildrenAsProperties = true)</b> 标记的,这导致不同的分析逻辑。有关 <b>ParseChildrenAttribute</b> 的更多信息,请参阅 SDK 文档。<a href="#innercontent">检索内部内容</a>主题也更详尽地说明了此问题。
<p>

<p>

<!--BEGIN SECTION-->
<p>
<a name="builder"><br> <span class="subhead">定义自定义控件生成器</span>
<p>

ASP.NET 页框架使用称为控件生成器的类来处理页上控件标记中的声明。每个 Web 窗体控件都与默认的控件生成器类 <b>System.Web.UI.ControlBuilder</b> 关联。默认的控件生成器为它在控件标记中遇到的每个嵌套控件将子控件添加到 Controls 集合。另外,它为嵌套控件标记之间的文本添加 <b>Literal</b> 控件。通过将自定义控件生成器类与控件关联,可以重写此默认行为。这通过对控件应用控件生成器属性来实现,如下面的示例所示。

<p><Acme:TabControl runat="server">
<Tab Name="C#">
[ControlBuilderAttribute(typeof(CustomParse2ControlBuilder))]
  public class CustomParse2 : Control {...}
</Tab>

<Tab Name="VB">
Public Class &lt;ControlBuilderAttribute(GetType(CustomParse2ControlBuilderVB))&gt; _
  CustomParse2VB : Inherits Control
</Tab>

<Tab Name="JScript">
ControlBuilderAttribute(CustomParse2ControlBuilder)
  class CustomParse2 extends Control {... }

</Tab>

</Acme:TabControl><p>

以上方括号里的元素为公共语言运行库属性,该属性将 <code>CustomParse2ControlBuilder</code> 类与 <code>CustomParse2</code> 控件关联。通过从 <b>ControlBuilder</b> 派生并重写其方法,可以定义您自己的自定义控件生成器。
<p>
下面的示例定义一个自定义控件生成器,它重写从 <b>ControlBuilder</b> 继承的 <b>GetChildControlType</b> 方法。此方法返回要添加的控件类型,并可用来决定将要添加哪些控件。在示例中,控件生成器仅在标记名称为“customitem”时才添加子控件。除了添加了自定义属性外,该控件的代码与上一示例非常相似。

<p>

<Acme:LangSwitch runat="server">
  <CsTemplate>
<Acme:SourceRef
  RunSample="/quickstart/aspplus/samples/webforms/ctrlauth/customparsing/CS/CustomParse2.aspx"
  ViewSource="/quickstart/aspplus/samples/webforms/ctrlauth/customparsing/CustomParse2.src"
  Icon="/quickstart/aspplus/images/ctrlauth15.gif"
  Caption="C# CustomParse2.aspx"
  runat="server" />
  </CsTemplate>
  <VbTemplate>
<Acme:SourceRef
  RunSample="/quickstart/aspplus/samples/webforms/ctrlauth/customparsing/VB/CustomParse2.aspx"
  ViewSource="/quickstart/aspplus/samples/webforms/ctrlauth/customparsing/CustomParse2.src"
  Icon="/quickstart/aspplus/images/ctrlauth15.gif"
  Caption="VB CustomParse2.aspx"
  runat="server" />
  </VbTemplate>
  <JsTemplate>
<Acme:SourceRef
  RunSample="/quickstart/aspplus/samples/webforms/ctrlauth/customparsing/JS/CustomParse2.aspx"
  ViewSource="/quickstart/aspplus/samples/webforms/ctrlauth/customparsing/CustomParse2.src"
  Icon="/quickstart/aspplus/images/ctrlauth15.gif"
  Caption="JScript CustomParse2.aspx"
  runat="server" />
  </JsTemplate>
</Acme:LangSwitch>

<!-- #include virtual="/quickstart/aspplus/include/footer.inc" -->

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -