摘要

之前在「Calendar 動態產生子控制項的 Event Handler」一文中有提到如何處理 Calendar 在 DayRender 事件動態產生按鈕的事件處理,文中最後有提及,若 Calendar 控制項有類似 GridView 控制項中有 RowCommand 事件,在使用上就可以更簡化。所以本文將擴展 Calendar 控制項,新增 DayCommand 事件,就動態產生的按鈕可以可以引發 DayCommand 事件,以便做後序的命令處理。

 

擴展 Calendar 控制項

繼承 Calendar 命名為 TBCalendar,新增 DayCommand 事件,覆寫 RaisePostBackEvent 方法,此方法是在處理引發 PostBack 產生的控制項事件,在此判斷若 PostBack 傳入的引數為 DayCommand${0}${1} 格式 (其中 {0} 為 CommandName,{1} 為日期),則引發 DayCommand 事件。另外新增 GetDayCommandEventReference 方法,提供取得引發 DayCommand 事件的用戶端指令碼。

    ''' <summary>
    ''' 月曆控制項。
    ''' </summary>
    < _
    Description("月曆控制項。"), _
    ToolboxData("<{0}:TBCalendar runat=server></{0}:TBCalendar>") _
    > _
    Public Class TBCalendar
        Inherits Calendar

#Region " DayCommand 事件 "

        ''' <summary>
        ''' DayCommand 事件引數。
        ''' </summary>
        Public Class DayCommandEventArgs
            Inherits System.EventArgs
            Private FCommandName As String = String.Empty
            Private FDate As Date = Date.MinValue

            ''' <summary>
            ''' 命令名稱。
            ''' </summary>
            Public Property CommandName() As String
                Get
                    Return FCommandName
                End Get
                Set(ByVal value As String)
                    FCommandName = value
                End Set
            End Property

            ''' <summary>
            ''' 日期。
            ''' </summary>
            Public Property [Date]() As Date
                Get
                    Return FDate
                End Get
                Set(ByVal value As Date)
                    FDate = value
                End Set
            End Property

        End Class

        ''' <summary>
        ''' 日期儲存格引發的命令事件。
        ''' </summary>
        < _
        System.ComponentModel.Category(WebCommon.Category.Action), _
        System.ComponentModel.Description("日期儲存格引發的命令事件。") _
        > _
        Public Event DayCommand(ByVal sender As Object, ByVal e As DayCommandEventArgs)

        ''' <summary>
        ''' 引發 DayCommand 事件。
        ''' </summary>
        Protected Overridable Sub OnDayCommand(ByVal e As DayCommandEventArgs)
            RaiseEvent DayCommand(Me, e)
        End Sub

#End Region

        ''' <summary>
        ''' 引發 PostBack 產生的控制項事件。
        ''' </summary>
        Protected Overrides Sub RaisePostBackEvent(ByVal eventArgument As String)
            Dim oArgument() As String
            Dim oEventArgs As DayCommandEventArgs

            If String.Compare(eventArgument, 0, "DayCommand", 0, "DayCommand".Length, StringComparison.Ordinal) = 0 Then

                oArgument = Split(eventArgument, "$")
                If oArgument.Length <> 3 Then Exit Sub
                oEventArgs = New DayCommandEventArgs()
                oEventArgs.CommandName = oArgument(1)
                oEventArgs.Date = Date.Parse(oArgument(2))
                OnDayCommand(oEventArgs)
                Exit Sub
            End If

            MyBase.RaisePostBackEvent(eventArgument)
        End Sub

        ''' <summary>
        ''' 取得引發 DayCommand 事件的用戶端指令碼。
        ''' </summary>
        ''' <param name="CommandName">命令名稱。</param>
        ''' <param name="Date">日期。</param>
        Public Function GetDayCommandEventReference(ByVal CommandName As String, ByVal [Date] As Date) As String
            Dim sArgument As String

            sArgument = String.Format("DayCommand${0}${1}", CommandName, [Date].ToShortDateString)
            Return Me.Page.ClientScript.GetPostBackEventReference(Me, sArgument)
        End Function


    End Class


測試程式

在頁面上放置 TBCalendar 控制項,在 DayRender 事件中動態產生一個 HtmlButton 按鈕,並利用 GetDayCommandEventReference 方法取得引發 DayCommand 事件的用戶端指令碼。在 DayCommand 事件中將 e.CommandName 及 e.Date 輸出在頁面上。

 

    Protected Sub Calendar1_DayRender(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DayRenderEventArgs) Handles Calendar1.DayRender
        Dim oButton As HtmlButton

        oButton = New HtmlButton()
        oButton.InnerText = "刪除"
        oButton.Attributes("onclick") = Calendar1.GetDayCommandEventReference("Delete", e.Day.Date)
        e.Cell.Controls.Add(oButton)
    End Sub

    Protected Sub Calendar1_DayCommand(ByVal sender As Object, ByVal e As Bee.Web.WebControls.TBCalendar.DayCommandEventArgs) Handles Calendar1.DayCommand
        Me.Response.Write(String.Format("DayCommand: {0} Date: {1}", e.CommandName, e.Date.ToShortDateString))
    End Sub

執行程式,按下某一日期的 [刪除] 鈕,就會引發其對應的 DayCommand 事件。

image

ASP.NET 魔法學院


DotBlogs Tags: Calendar ServerControl

Feedback

  • WizardWu 2008/9/13 上午 10:15 回覆

    # re: 擴展 Calendar 控制項 - DayCommand 事件

    您好:
    能否請問,您提供下載的「TBDateEdit 日期控制項 - 1.0 版」,裡面附的 .chm 說明文件「TBDateEdit.chm」,是用哪一款軟件製作的?謝謝。

    能否提供軟件名稱?或下載點?甚至方便的話,是否能直接將該款軟件寄給小弟?因為小弟最近也剛開始幫敝公司寫自訂控件,正在找能製作使用說明文件的工具。
    謝謝您。

    contempt@pchome.com.tw

    ~小吳

  • WizardWu 2008/9/14 上午 12:59 回覆

    # re: 擴展 Calendar 控制項 - DayCommand 事件

    您好:
    能否續上一篇繼續請教,若您 chm 文件,是用 Microsoft HTML Help 1.4 SDK 這類的軟體製作的,那您裡面 Class 的階層關係、類別屬性方法的文字超連結、裡面的 HTML 格式、類似 MSDN Library 那種格式,您是如何製作出來的,是否有什軟體或做法,可自動做出此類 API 查閱的格式呢?

    謝謝。

    contempt@pchome.com.tw

  • chhuang 2008/9/14 上午 11:43 回覆

    # re: 擴展 Calendar 控制項 - DayCommand 事件

    雖然我不知道格主是用什麼軟體製作。

    不過,SandCastle 可以輕輕鬆鬆就可以建立專業的 chm 說明文件囉。http://www.codeplex.com/Sandcastle

     

     

  • WizardWu 2008/9/14 下午 01:18 回覆

    # re: 擴展 Calendar 控制項 - DayCommand 事件

    感謝 chhuang 的回應,

    等下來試看看,for Managed Clsss Libraries 的功能如何。

  • jeff377 2008/9/15 下午 04:37 回覆

    # re: 擴展 Calendar 控制項 - DayCommand 事件

    我是使用 NDoc 來製作 Help 檔案。

    http://ndoc.sourceforge.net/

    用上面提供的 SandCastle 也可以製作 Help 檔案。

     

  • WizardWu 2008/9/15 下午 10:17 回覆

    # re: 擴展 Calendar 控制項 - DayCommand 事件

    感謝二位的回應。
    昨天周日花了一天的時間,研究 SandCastle,
    都是在對岸的網站和 blog、博客園 找到想要的資料。
    目前已可自製 chm,並寫入我想要的中文註解。

    對岸也有人提到 NDoc。

  • alice 2008/9/16 上午 10:24 回覆

    # re: 擴展 Calendar 控制項 - DayCommand 事件

    to WizardWu :
    開一篇介紹 SandCastle 如何?

  • WizardWu 2008/9/16 下午 12:56 回覆

    # re: 擴展 Calendar 控制項 - DayCommand 事件

    對岸的 博客園 等地,以及對岸網路,
    有很多文件。
    在台灣的話就…

    小弟我只有簡體版的blog,以便和對岸的人討論。

  • chhuang 2008/9/16 下午 01:37 回覆

    # re: 擴展 Calendar 控制項 - DayCommand 事件

    如果可以的話,發篇繁體的介紹文章也很棒阿。:D

    如果沒有人想為台灣的技術進一些些心力,大家以後都去大陸博客園找資料就好了,那創立點部落就沒有啥意義了。

  • jeff 2008/9/16 下午 04:21 回覆

    # re: 擴展 Calendar 控制項 - DayCommand 事件

    to chhuang :
    我也有在使用 SandCastle,過二天再來整理一篇相關文章。

  • 卡通服装 2008/11/25 下午 02:57 回覆

    # re: 擴展 Calendar 控制項 - DayCommand 事件

    收藏收藏,写的太好了

  • 打包机 2009/3/4 下午 02:36 回覆

    # re: 擴展 Calendar 控制項 - DayCommand 事件

    打包收藏起来,,谢谢了

  • 包装机械 2009/3/4 下午 02:37 回覆

    # re: 擴展 Calendar 控制項 - DayCommand 事件

    蛮强大的嘛,呵呵好,

標題 *
名稱 *
Email (將不會被顯示)
Url
回應
登入後使用進階評論
Please add 5 and 2 and type the answer here: