惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Help Net Security
Help Net Security
S
Schneier on Security
Security Latest
Security Latest
C
Cyber Attacks, Cyber Crime and Cyber Security
博客园_首页
K
Kaspersky official blog
B
Blog
雷峰网
雷峰网
MyScale Blog
MyScale Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
人人都是产品经理
人人都是产品经理
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
T
Threatpost
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Latest news
Latest news
J
Java Code Geeks
W
WeLiveSecurity
GbyAI
GbyAI
V
Vulnerabilities – Threatpost
S
Secure Thoughts
IT之家
IT之家
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 叶小钗
Engineering at Meta
Engineering at Meta
S
Security @ Cisco Blogs
罗磊的独立博客
M
MIT News - Artificial intelligence
Blog — PlanetScale
Blog — PlanetScale
Stack Overflow Blog
Stack Overflow Blog
月光博客
月光博客
P
Proofpoint News Feed
博客园 - 聂微东
云风的 BLOG
云风的 BLOG
N
Netflix TechBlog - Medium
D
DataBreaches.Net
S
SegmentFault 最新的问题
V
Visual Studio Blog
V
V2EX
The Register - Security
The Register - Security
N
News | PayPal Newsroom
aimingoo的专栏
aimingoo的专栏
C
Cybersecurity and Infrastructure Security Agency CISA
N
News and Events Feed by Topic
Hacker News: Ask HN
Hacker News: Ask HN
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Google DeepMind News
Google DeepMind News
Webroot Blog
Webroot Blog
NISL@THU
NISL@THU
D
Darknet – Hacking Tools, Hacker News & Cyber Security

博客园 - jeff377

使用 Sandcastle Help File Builder 制作 VS.NET 的 HELP 文件 [ASP.NET 控件实作 Day30] 整合 jQuery ContextMenu plugin 的右键选单控件 [ASP.NET 控件实作 Day29] 解决 DropDownList 成员 Value 值相同产生的问题 [ASP.NET 控件实作 Day28] 图形验证码控件 [ASP.NET 控件实作 Day27] 控件依 FormView CurrentMode 自行设定状态 [ASP.NET 控件实作 Day26] 让你的 GridView 与众不同 [ASP.NET 控件实作 Day25] 自订 GridView 字段 - 日期字段 [ASP.NET 控件实作 Day24] TBDropDownField 的 Items 属性的数据系结 [ASP.NET 控件实作 Day23] 自订 GridVie 字段类别 - 实作 TBDropDownField 字段类别 [ASP.NET 控件实作 Day22] 让 DropDownList 不再因项目清单不存在而造成错误 [ASP.NET 控件实作 Day21] 实作控件智能卷标 [ASP.NET 控件实作 Day20] 侦错设计阶段的程序代码 [ASP.NET 控件实作 Day19] 控件设计阶段的外观 [ASP.NET 控件实作 Day18] 修改集合属性编辑器 [ASP.NET 控件实作 Day17] 集合属性包含不同型别的成员 [ASP.NET 控件实作 Day16] 继承 WebControl 实作 Toolbar 控件 [ASP.NET 控件实作 Day15] 复合控件隐藏的问题 [ASP.NET 控件实作 Day14] 继承 CompositeControl 实作 Toolbar 控件 [ASP.NET 控件实作 Day13] Flash 控件
[ASP.NET 控件实作 Day31] TBContextMenu 控件三种不同模式的 Click 动作
jeff377 · 2008-11-06 · via 博客园 - jeff377

上一篇 整合 jQuery ContextMenu plugin 的右键选单控件 的文章中,我们实作了 TBContextMenu 控件;本文将以 TBContextMenu 控件为例,为选单项目加入 Click 事件,并说明三种不同模式的 Click 动作。

程序代码下载:ASP.NET Server Control - Day31.rar

一、AutoPostBack AutoCallBack 属性

TBMenuItem 类别原有个 OnClientClick 属性,设定要执行的客户端指令码;此为客户端的的 Click 动作,执行指定的 JavaScript 指令码。我们在 TBMenuItem 属性新增 AutoPostBack 及 AutoCallBack 属性,分别用来设定选单项目的 PostBack 及 CallBack 动作。另外 ClientCallBack 为执行 CallBack 时,会接收成功的服务器事件结果的客户端事件处理例程名称。

image 

二、新增 Click 事件

TBContextMenu 新增 Click 事件及 ClickEventArgs 事件自变量类别,ClickEventArgs 类别包含 Key 属性表示按钮键值,CallBackResult 属性保留给 CallBack 使用。

        ''' <summary>
        ''' Click 事件引數。
        ''' </summary>
        Public Class ClickEventArgs
            Inherits System.EventArgs
            Private FKey As String = String.Empty
            Private FCallbackResult As String = String.Empty
 
            ''' <summary>
            ''' 鍵值。
            ''' </summary>
            Public Property Key() As String
                Get
                    Return FKey
                End Get
                Set(ByVal value As String)
                    FKey = value
                End Set
            End Property
 
            ''' <summary>
            ''' 執行 CallBack 回傳結果。
            ''' </summary>
            Public Property CallbackResult() As String
                Get
                    Return FCallbackResult
                End Get
                Set(ByVal value As String)
                    FCallbackResult = value
                End Set
            End Property
        End Class
 
        ''' <summary>
        ''' 按下選單所引發的事件。
        ''' </summary>
        < _
        Description("按下選單所引發的事件。") _
        > _
        Public Event Click(ByVal sender As Object, ByVal e As ClickEventArgs)
 
        ''' <summary>
        ''' 引發 Click 事件。
        ''' </summary>
        Protected Overridable Sub OnClick(ByVal e As ClickEventArgs)
            RaiseEvent Click(Me, e)
        End Sub

三、实作 IPostBackEventHandler 界面

实作 IPostBackEventHandler 接口,当选单项目产生 PostBack 动作后,在 RaisePostBackEvent 方法中,取得选单项目的键值 (eventArgument 参数),并引发 Click 事件。

        Public Sub RaisePostBackEvent(ByVal eventArgument As String) Implements IPostBackEventHandler.RaisePostBackEvent
            Dim oEventArgs As ClickEventArgs
 
            oEventArgs = New ClickEventArgs()
            oEventArgs.Key = eventArgument
            Me.OnClick(oEventArgs)
        End Sub

四、实作 ICallbackEventHandler 界面

实作 ICallbackEventHandler 接口,当选单项目产生 CallBack 动作后,会先执行 RaiseCallbackEvent 方法,在此方法接收客户端传入的键值 (eventArgument 参数),并引发 Click 事件,最后会将 ClickEventArgs.CallbackResult 的结果回传到客户端,由客户端指定的事件处理例程,来处理服务器回传的结果。

        Public Function GetCallbackResult() As String Implements ICallbackEventHandler.GetCallbackResult
            Return FCallbackResult
        End Function
 
        Public Sub RaiseCallbackEvent(ByVal eventArgument As String) Implements ICallbackEventHandler.RaiseCallbackEvent
            Dim oEventArgs As ClickEventArgs
 
            oEventArgs = New ClickEventArgs()
            oEventArgs.Key = eventArgument
            Me.OnClick(oEventArgs)
            FCallbackResult = oEventArgs.CallbackResult
        End Sub

五、输出选单项目的客户端指令码

在 Render 方法中,会有一段输出程序代码来输出每个选单项目的客户端指令码;其中会透过  GetItemClientScritp 私有方法,取得指定选单项目的客户端指令码。

            For Each oItem In Me.Items
                sClientClick = GetItemClientScript(oItem)
                If StrIsNotEmpty(sClientClick) Then
                    If bFlag Then
                        oScript.AppendLine(",")
                    End If
                    oScript.AppendLine("'" & oItem.Key & "': function(t) {")
                    oScript.AppendLine(sClientClick)
                    oScript.AppendLine("}")
                    bFlag = True
                End If
            Next

GetItemClientScritp 私有方法程序代码如下,会判断 TBMenuItem 是否设定 AutoPostBack、AutoCallBack 或 OnClientClick 属性,来决定客户端选单项目 Click 动作的行为。

        Private Function GetItemClientScript(ByVal Item As TBMenuItem) As String
            Dim sScript As String
 
            If Item.AutoPostBack Then
                sScript = Me.Page.ClientScript.GetPostBackEventReference(Me, Item.Key) & ";"
            ElseIf Item.AutoCallBack Then
                sScript = Me.Page.ClientScript.GetCallbackEventReference(Me, "'" & Item.Key & "'", Item.ClientCallBack, "''") & ";"
            ElseIf StrIsNotEmpty(Item.OnClientClick) Then
                sScript = Item.OnClientClick
            Else
                sScript = String.Empty
            End If
            Return sScript
        End Function

六、测试程序

在页面拖曳 TBContextMenu,设定 Delete1、Delete2、Delete3 三个 TBMenuItem。其中 Delete1 设定 OnClientClick 属性;Delete2 设定 AutoPostBack 属性为 True,会以 PostBack 方法引发伺服端的 Click 事件;Delete3 设定 AutoCallBack 属性为 True,会以 CallBack 方法引发伺服端的 Click 事件,并设定 ClientCallBack 属性决定接收成功的服务器事件结果的客户端事件处理例程名称。

        <bee:TBContextMenu ID="TBContextMenu1" runat="server" ControlID="Label1">
            <Items>
                <bee:TBMenuItem Key="open" Text="Open" ImageUrl="~/image/folder.png" OnClientClick="alert('open');" />
                <bee:TBMenuItem Key="email" Text="Email" ImageUrl="~/image/email.png" OnClientClick="alert('email');" />
                <bee:TBMenuItem Key="save" Text="Save" ImageUrl="~/image/disk.png" OnClientClick="alert('save');" />
                <bee:TBMenuItem Key="delete1" Text="Delete1" ImageUrl="~/image/cross.png" OnClientClick="alert('client click');" />
                <bee:TBMenuItem Key="delete2" Text="Delete2" ImageUrl="~/image/cross.png"  AutoPostBack="true" />
                <bee:TBMenuItem Key="delete3" Text="Delete3" ImageUrl="~/image/cross.png"  AutoCallBack="true" ClientCallBack="ReceiveServerData"/>
            </Items>
        </bee:TBContextMenu>

在伺服端 Click 事件撰写测试程序代码,可以利用 Me.IsCallback 来判断目前是否在 CallBack 状态中。

    Protected Sub TBContextMenu1_Click(ByVal sender As Object, ByVal e As Bee.Web.WebControls.TBContextMenu.ClickEventArgs) Handles TBContextMenu1.Click
        If Not Me.IsCallback Then
            Me.ClientScript.RegisterStartupScript(Me.GetType, "alert", _
               String.Format("alert('PostBack Click: {0}');", e.Key), True)
        Else
            e.CallbackResult = e.Key
        End If
    End Sub

另外 Delete3 选单项目有设定 ClientCallBack="ReceiveServerData",所以 aspx 程序代码中会有 ReceiveServerData JavaScript 函式,来接收 CallBack 时由伺服端传回的结果。

    <script type="text/javascript">
        function ReceiveServerData(rValue) {
            alert('CallBack Click: '+rValue);
        };
    </script>

执行程序,先选取 Delete1 选单项目,会执行在 OnClientClick 属性指定的客户端指令码。

image

当选取 Delete2 选单项目时,会产生 PostBack 动作并引发伺服端的 Click 事件,在 Click 事件中会输出要执行的客户端指令码。

image

当选取 Delete3 选单项目时,会产生 CallBack 动作并引发伺服端的 Click 事件,在 Click 事件中设定 e.CallbackResult 属性值,并将 e.CallbackResult 的结果回传给客户端的 ReceiveServerData 函式来处理。

image