📄 webctrlauthoring.aspx
字号:
</Tab>
<Tab Name="JScript">
Event handlers can only be consumed and not created in JScript.
</Tab>
</Acme:TabControl><p>
<li>为 <b>TextBox</b> 的 <b>TextChanged</b> 事件定义了一个事件处理方法。该方法通过调用 <code>OnChange</code> 方法来引发 <code>Change</code> 事件。
<p><Acme:TabControl runat="server">
<Tab Name="C#">
private void TextBox_Change(Object sender, EventArgs e) {
OnChange(EventArgs.Empty);
}
</Tab>
<Tab Name="VB">
Private Sub TextBox_Change(sender As Object, e As EventArgs)
OnChange(EventArgs.Empty)
End Sub
</Tab>
<Tab Name="JScript">
private function TextBox_Change(sender:Object, e:EventArgs) : void {
OnChange(EventArgs.Empty);
}
</Tab>
</Acme:TabControl><p>
<li><b>CreateChildControls</b> 方法创建一个事件处理程序的实例,该实例引用上述方法并将事件处理程序附加到 <b>TextBox</b> 实例的 <b>TextChanged</b> 事件。
<p><Acme:TabControl runat="server">
<Tab Name="C#">
protected override void CreateChildControls() {
..
TextBox box = new TextBox();
box.TextChanged += new EventHandler(this.TextBox_Change);
...
}
</Tab>
<Tab Name="VB">
Protected Overrides Sub CreateChildControls()
...
Dim box As New TextBox()
AddHandler Box.TextChanged, AddressOf TextBox_Change
...
End Sub
</Tab>
<Tab Name="JScript">
override protected function CreateChildControls() : void {
..
var box:TextBox = new TextBox();
box.add_TextChanged(this.TextBox_Change);
...
}
</Tab>
</Acme:TabControl><p>
</ul>
<code>Change</code> 事件可以由承载控件的页来处理,如下面的示例所示。在此示例中,页为 <code>Change</code> 事件提供事件处理方法。如果用户输入的数字为负,该事件将 <code>Value</code> 属性设置为零。
<p>
<Acme:LangSwitch runat="server">
<CsTemplate>
<Acme:SourceRef
RunSample="/quickstart/aspplus/samples/webforms/ctrlauth/composition/CS/Composition3.aspx"
ViewSource="/quickstart/aspplus/samples/webforms/ctrlauth/composition/Composition3.src"
Icon="/quickstart/aspplus/images/ctrlauth7.gif"
Caption="C# Composition3.aspx"
runat="server" />
</CsTemplate>
<VbTemplate>
<Acme:SourceRef
RunSample="/quickstart/aspplus/samples/webforms/ctrlauth/composition/VB/Composition3.aspx"
ViewSource="/quickstart/aspplus/samples/webforms/ctrlauth/composition/Composition3.src"
Icon="/quickstart/aspplus/images/ctrlauth7.gif"
Caption="VB Composition3.aspx"
runat="server" />
</VbTemplate>
<JsTemplate>
<Acme:SourceRef
RunSample="/quickstart/aspplus/samples/webforms/ctrlauth/composition/JS/Composition3.aspx"
ViewSource="/quickstart/aspplus/samples/webforms/ctrlauth/composition/Composition3.src"
Icon="/quickstart/aspplus/images/ctrlauth7.gif"
Caption="JScript Composition3.aspx"
runat="server" />
</JsTemplate>
</Acme:LangSwitch>
<!--BEGIN SECTION-->
<p>
<a name="viewstate"><br> <span class="subhead">维护状态</span>
<p>
每个 Web 窗体控件都有一个 <b>State</b> 属性(从 <b>Control</b> 继承),该属性使 Web 窗体控件能够参与 <b>State</b> 管理。<b>State</b> 的类型为 <b>Sytem.Web.UI.StateBag</b>,这是等效于哈希表的数据结构。控件可以将数据作为键/值对保存在 <b>State</b> 中。<b>State</b> 通过 ASP.NET 页框架保持为字符串变量,并以隐藏变量的形式与客户端之间往返。回发时,页框架分析来自隐藏变量的输入字符串,并在页的控件层次结构中填充每个控件的 <b>State</b> 属性。通过使用 <b>State</b> 属性,控件可以还原其状态(将属性和字段设置为它们回发前的值)。控件开发人员应该知道通过往返行程将数据发送到客户端存在性能开销,并且应该明白他们在 <b>State</b> 中保存的内容。
<p>
下面的代码示例显示在 <b>State</b> 中保存的属性。
<p><Acme:TabControl runat="server">
<Tab Name="C#">
public String Text {
get {
return (String) State["Text"];
}
set {
State["Text"] = value;
}
}
</Tab>
<Tab Name="VB">
Public Property Text As String
Get
Return CType(State("Text"), String))
End Get
Set
State("Text") = Value
End Set
End Property
</Tab>
<Tab Name="JScript">
public function get Text() : String
{
return String(State("Text"));
}
public function set Text(value:String) : void
{
State("Text") = value;
}
</Tab>
</Acme:TabControl><p>
下面的示例显示自定义控件<code>Label</code>。该控件具有两个属性 <code>Text</code> 和 <code>FontSize</code>,它们保存于 <b>State</b> 中。使用 <b>Label</b> 的 ASP.NET 页包含具有事件处理程序的按钮。当单击按钮时,该事件处理程序增加 <b>Label</b> 中的文本字体大小。因此,每次单击按钮时,字体大小都增加。这可能只是由于状态管理的缘故——<code>Label</code> 需要在回发前知道字体大小是多少,以便在回发后呈现下一个更大的字体。
<p>
<Acme:LangSwitch runat="server">
<CsTemplate>
<Acme:SourceRef
RunSample="/quickstart/aspplus/samples/webforms/ctrlauth/viewstate/CS/Label.aspx"
ViewSource="/quickstart/aspplus/samples/webforms/ctrlauth/viewstate/Label.src"
Icon="/quickstart/aspplus/images/ctrlauth8.gif"
Caption="C# Label.aspx"
runat="server" />
</CsTemplate>
<VbTemplate>
<Acme:SourceRef
RunSample="/quickstart/aspplus/samples/webforms/ctrlauth/viewstate/VB/Label.aspx"
ViewSource="/quickstart/aspplus/samples/webforms/ctrlauth/viewstate/Label.src"
Icon="/quickstart/aspplus/images/ctrlauth8.gif"
Caption="VB Label.aspx"
runat="server" />
</VbTemplate>
<JsTemplate>
<Acme:SourceRef
RunSample="/quickstart/aspplus/samples/webforms/ctrlauth/viewstate/JS/Label.aspx"
ViewSource="/quickstart/aspplus/samples/webforms/ctrlauth/viewstate/Label.src"
Icon="/quickstart/aspplus/images/ctrlauth8.gif"
Caption="JScript Label.aspx"
runat="server" />
</JsTemplate>
</Acme:LangSwitch>
<!--BEGIN SECTION-->
<p>
<a name="noncomposition"><br> <span class="subhead">开发处理回发数据的自定义(非复合)控件</span>
<p>
您在本“入门”开始时创作了简单的自定义控件。下面的示例说明一个做更有意义的事情的自定义控件——它呈现输入框,并读入用户输入的数据。检查回发(输入)数据的控件必须实现 <b>System.Web.UI.IPostBackDataHandler</b> 接口。这将向 ASP.NET 页框架发出信号,指出控件应参与回发数据处理。页框架将输入数据作为键/值对传递给此接口的 <b>LoadPostData</b> 方法。在此方法的实现中,控件可以像下面这样检查输入数据并更新其属性。
<p><Acme:TabControl runat="server">
<Tab Name="C#">
private int _value = 0;
public bool LoadPostData(String postDataKey, NameValueCollection values) {
_value = Int32.Parse(values[this.UniqueID]);
return false;
}
</Tab>
<Tab Name="VB">
Private _value As Integer = 0
Public Function LoadPostData(postDataKey As String, values As NameValueCollection) As Boolean
_value = Int32.Parse(values(Me.UniqueID))
Return(False)
End Function
</Tab>
<Tab Name="JScript">
private var _value:int = 0;
public function LoadPostData(postDataKey:String, values:NameValueCollection) : Boolean {
_value = Int32.Parse(values[this.UniqueID]);
return false;
}
</Tab>
</Acme:TabControl><p>
下面的示例定义自定义控件 <code>NonComposition1</code>,该控件实现 <b>IPostBackDataHandler</b> 并具有一个 <code>Value</code> 属性。该控件呈现 HTML 输入框,该框的文本属性为 <code>Value</code> 的字符串表示形式。通过检查回发输入数据设置该属性。使用 <code>NonComposition1</code> 的页还具有两个按钮,它们有增加和减少 <code>NonComposition1</code> 的 <code>Value</code> 属性的事件处理程序。
<p>
<Acme:LangSwitch runat="server">
<CsTemplate>
<Acme:SourceRef
RunSample="/quickstart/aspplus/samples/webforms/ctrlauth/noncomposition/CS/NonComposition1.aspx"
ViewSource="/quickstart/aspplus/samples/webforms/ctrlauth/noncomposition/NonComposition1.src"
Icon="/quickstart/aspplus/images/ctrlauth9.gif"
Caption="C# NonComposition1.aspx"
runat="server" />
</CsTemplate>
<VbTemplate>
<Acme:SourceRef
RunSample="/quickstart/aspplus/samples/webforms/ctrlauth/noncomposition/VB/NonComposition1.aspx"
ViewSource="/quickstart/aspplus/samples/webforms/ctrlauth/noncomposition/NonComposition1.src"
Icon="/quickstart/aspplus/images/ctrlauth9.gif"
Caption="VB NonComposition1.aspx"
runat="server" />
</VbTemplate>
<JsTemplate>
<Acme:SourceRef
RunSample="/quickstart/aspplus/samples/webforms/ctrlauth/noncomposition/JS/NonComposition1.aspx"
ViewSource="/quickstart/aspplus/samples/webforms/ctrlauth/noncomposition/NonComposition1.src"
Icon="/quickstart/aspplus/images/ctrlauth9.gif"
Caption="JScript NonComposition1.aspx"
runat="server" />
</JsTemplate>
</Acme:LangSwitch>
<p>
<!--BEGIN SECTION-->
<p>
<a name="javascript"><br> <span class="subhead">为自定义回发生成客户端 JavaScrip</span>
<p>
如果控件要捕获回发事件(来自客户端的窗体提交),它必须实现 <b>System.Web.UI.IPostBackEventHandler</b> 接口。此接口向 ASP.NET 页框架发出信号,指出控件希望收到回发事件通知。<b>RaisePostBackEvent</b> 方法允许控件处理该事件和引发其他事件。另外,ASP.NET 页框架具有自定义事件结构,该结构允许控件生成启动自定义回发的客户端 JavaScript。回发通常仅由几个元素启动,如 Submit(提交)按钮或 Image(图像)按钮。不过,通过发出客户端 JavaScript,控件也可以从其他 HTML 元素启动回发。
<p>
下面的示例定义一个在上一示例 <code>NonComposition1</code> 之上生成的自定义控件 <code>NonComposition2</code>。除了 <code>NonComposition1</code> 提供的接口,它还呈现两个 <b>HtmlButtons</b>,它们生成在单击时导致回发的客户端 JavaScript。这些按钮的名称属性是 Add 和 Subtract。名称属性以字符串参数的形式,通过页框架传递到 <b>RaisePostBackEvent</b>。<code>NonComposition2</code> 实现 <b>RaisePostBackEvent</b> 以在单击 Add(添加)按钮时增大 <code>Value</code> 属性,而在单击 Subtract(减小)按钮时减小 <code>Value</code> 属性,如下所示。
<p><Acme:TabControl runat="server">
<Tab Name="C#">
public void RaisePostBackEvent(String eventArgument) {
if (eventArgument == "Add") {
this.Value++; }
else {
this.Value--;
}
}
</Tab>
<Tab Name="VB">
Public Sub RaisePostBackEvent(eventArgument As String)
If eventArgument = "Add" Then
Me.Value = Me.Value + 1
Else
Me.Value = Me.Value - 1
End If
End Sub
</Tab>
<Tab Name="JScript">
public function RaisePostBackEvent(eventArgument:String) : void {
if (eventArgument == "Add") {
this.Value++; }
else {
this.Value--;
}
}
</Tab>
</Acme:TabControl><p>
显示给客户端的用户界面与上一示例中的相同;不过,整个 UI 由一个也处理回发事件的自定义控件来呈现。页面开发人员只需将 <code>NonComposition2</code> 添加到页,不必提供任何事件处理逻辑。下面的示例显示了此代码的运行。
<p>
<Acme:LangSwitch runat="server">
<CsTemplate>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -