我们知道在 GridView 的 Columns 集合属性中,可以包含不同型别的字段,如 BoundFIeld、CheckBoxField、HyperLinkField ...等不同型别的字段。如果我们希望工具列中不只包含按钮,可以包含其它不同类型的子控件,那该怎么做呢?本文就以上篇中的 TBToolbar 控件为案例,让 Items 集合属性可以加入 Button、TextBox、Label ...等不同的子控件。

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

 

一、不同型别的集合成员

我们的需求是让工具列可以加入 Button、TextBox、Label 三种子控件,所以继承原来的 TBToolbarItem (只保留 Enabled 属性),新增了 TBToolbarButton、TBToolbarTextbox、TBToolbarLabel 三个类别。

 

image

这些新增的成员类别都是继承至 TBToolbarItem,所以在 aspx 程序代码中,手动输入 Items 的成员时,就会列出这几种定义的成员型别。

image

 

二、建立不同型别集合成员的子控件

因为 Items 属性的成员具不同型别,所以我们要改写 RenderContents 方法,判断成员型别来建立对应类型的子控件。若为 TBToolbarButton 型别建立 Button 控件、若为 TBToolbarTextbox 型别则建立 TextBox 控件、若为 TBToolbarLabel 型别则建立 Label 控件。其中 TBToolbarButton 建立的控件为 TBButton,这个控件是我们在「 [ASP.NET 控件实作 Day3] 扩展现有服务器控件功能 」一文中实作的具询问讯息的按钮控件。

        ''' <summary>
        ''' 覆寫 RenderContents 方法。
        ''' </summary>
        Protected Overrides Sub RenderContents(ByVal writer As System.Web.UI.HtmlTextWriter)
            Dim oItem As TBToolbarItem
            Dim oControl As Control
 
            For Each oItem In Me.Items
                If TypeOf oItem Is TBToolbarButton Then
                    '建立 Button 控制項
                    oControl = CreateToolbarButton(CType(oItem, TBToolbarButton))
                ElseIf TypeOf oItem Is TBToolbarTextbox Then
                    '建立 Textbox 控制項
                    oControl = CreateToolbarTextbox(CType(oItem, TBToolbarTextbox))
                Else
                    '建立 Label 控制項
                    oControl = CreateToolbarLabel(CType(oItem, TBToolbarLabel))
                End If
                Me.Controls.Add(oControl)
            Next
 
            MyBase.RenderContents(writer)
        End Sub
 
        ''' <summary>
        ''' 建立工具列按鈕。
        ''' </summary>
        Private Function CreateToolbarButton(ByVal Item As TBToolbarButton) As Control
            Dim oButton As TBButton
            Dim sScript As String
 
            oButton = New TBButton()
            oButton.Text = Item.Text
            oButton.Enabled = Item.Enabled
            oButton.ID = Item.Key
            oButton.ConfirmMessage = Item.ConfirmMessage
            sScript = Me.Page.ClientScript.GetPostBackEventReference(Me, Item.Key)
            oButton.OnClientClick = sScript
 
            Return oButton
        End Function
 
        ''' <summary>
        ''' 建立工具列文字框。
        ''' </summary>
        Private Function CreateToolbarTextbox(ByVal Item As TBToolbarTextbox) As Control
            Dim oTextBox As TextBox
 
            oTextBox = New TextBox
            Return oTextBox
        End Function
 
        ''' <summary>
        ''' 建立工具列標籤。
        ''' </summary>
        Private Function CreateToolbarLabel(ByVal Item As TBToolbarLabel) As Control
            Dim oLabel As Label
 
            oLabel = New Label()
            oLabel.Text = Item.Text
            Return oLabel
        End Function

 

我们手动在 aspx 程序代码中输入不同型别的成员,TBToolbar 控件就会呈现对应的子控件。

image

 

三、执行程序

执行程序,就可以在浏览器看到呈现的工具列,当按下「删除」时也会出现我们定义的询问讯息。

 

image

输出的 HTML 码如下

<span id="TBToolbar1">
<input type="submit" name="TBToolbar1$Add" value="新增" onclick="__doPostBack('TBToolbar1','Add');" id="TBToolbar1_Add" />
<input type="submit" name="TBToolbar1$Edit" value="修改" onclick="__doPostBack('TBToolbar1','Edit');" id="TBToolbar1_Edit" />
<input type="submit" name="TBToolbar1$Delete" value="刪除" onclick="if (confirm('確定刪除嗎?')==false) {return false;}__doPostBack('TBToolbar1','Delete');" id="TBToolbar1_Delete" />
<span>關鍵字</span>
<input name="TBToolbar1$ctl01" type="text" />
<input type="submit" name="TBToolbar1$Search" value="搜尋" onclick="__doPostBack('TBToolbar1','Search');" id="TBToolbar1_Search" />
</span>

 

备注:本文同步发布于「第一届iT邦帮忙铁人赛」,如果你觉得这篇文章对您有帮助,记得连上去推鉴此文增加人气 ^^
http://ithelp.ithome.com.tw/question/10012600

posted on 2008-10-18 13:11  jeff377  阅读(1907)  评论(7编辑  收藏  举报