[ASP.NET 控件实作 Day17] 集合属性包含不同型别的成员

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

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

 

一、不同型别的集合成员

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

 

[ASP.NET 控件实作 Day17] 集合属性包含不同型别的成员

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

[ASP.NET 控件实作 Day17] 集合属性包含不同型别的成员

 

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

因为 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 控件就会呈现对应的子控件。

[ASP.NET 控件实作 Day17] 集合属性包含不同型别的成员

 

三、执行程序

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

 

[ASP.NET 控件实作 Day17] 集合属性包含不同型别的成员

输出的 HTML 码如下

<span id="TBToolbar1">
<input type="submit" name="TBToolbar1$Add" value="新增" οnclick="__doPostBack('TBToolbar1','Add');" id="TBToolbar1_Add" />
<input type="submit" name="TBToolbar1$Edit" value="修改" οnclick="__doPostBack('TBToolbar1','Edit');" id="TBToolbar1_Edit" />
<input type="submit" name="TBToolbar1$Delete" value="刪除" οnclick="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="搜尋" οnclick="__doPostBack('TBToolbar1','Search');" id="TBToolbar1_Search" />
</span>

 

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

转载于:https://www.cnblogs.com/jeff377/archive/2008/10/18/1314028.html