我们知道在 GridView 的 Columns 集合属性中,可以包含不同型别的字段,如 BoundFIeld、CheckBoxField、HyperLinkField ...等不同型别的字段。如果我们希望工具列中不只包含按钮,可以包含其它不同类型的子控件,那该怎么做呢?本文就以上篇中的 TBToolbar 控件为案例,让 Items 集合属性可以加入 Button、TextBox、Label ...等不同的子控件。
程序代码下载:ASP.NET Server Control - Day17.rar
一、不同型别的集合成员
我们的需求是让工具列可以加入 Button、TextBox、Label 三种子控件,所以继承原来的 TBToolbarItem (只保留 Enabled 属性),新增了 TBToolbarButton、TBToolbarTextbox、TBToolbarLabel 三个类别。
这些新增的成员类别都是继承至 TBToolbarItem,所以在 aspx 程序代码中,手动输入 Items 的成员时,就会列出这几种定义的成员型别。
二、建立不同型别集合成员的子控件
因为 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 控件就会呈现对应的子控件。
三、执行程序
执行程序,就可以在浏览器看到呈现的工具列,当按下「删除」时也会出现我们定义的询问讯息。
输出的 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
[新闻]Google关闭其中一家总部员工餐厅
博客园首页 社区 新闻频道 小组 博问 网摘 闪存
文章来源: http://www.cnblogs.com/jeff377/archive/2008/10/18/1314028.html