复合控件开发中的一点心得

博客介绍复合控件属性管理问题,当需暴露子控件众多属性时,若无分类管理会使属性浏览器混乱。作者在开发中把复合控件的子控件作为属性保存,给出了复合控件继承及Builder类、Designer类实现代码,还展示了复合控件属性及重载AddParsedSubObject方法的代码。
对于一个复合控件,其属性一般都是委托到子控件的属性。
但有时,我们需要将子控件的很多属性暴露出来。如果没有很好的分类管理,在属性浏览器里会很混乱。我在实际的开发过程中,是将子控件作为一个属性保存的。实现方法如下:
首先我的复合控件有一个datagrid,两个button,一个textbox。
复合控件(CompositeControl)继承于webcontrol,同时为其创建了builder类和designer类。
Builder类:
Public Overrides Function GetChildControlType(ByVal tagName As String, ByVal attribs As ystem.Collections.IDictionary) As System.Type
       
If  tagName.ToLower().EndsWith("textbox") Then
           
Return GetType(TextBox)
       
End If
       
If tagName.ToLower().EndsWith("datagrid") Then
           
Return GetType(DataGrid)
       
End If
       
If tagName.ToLower().EndsWith("button") Then
           
Return GetType(Button)
       
End If
       
Return Nothing
End Function

Designer类:
Public Overrides Function GetPersistInnerHtml() As String
       
Dim strWriter As StringWriter     
       
Dim htmlWriter As HtmlTextWriter  
       
Dim control As PressListBox   
   
        strWriter
= New StringWriter
        htmlWriter
= New HtmlTextWriter(strWriter)
        control
= CType(Me.Component, CompositeControl)
       
MyBase.GetPersistInnerHtml()

        htmlWriter.Write(ControlPersister.PersistControl(control.TextBox))
        htmlWriter.Write(ControlPersister.PersistControl(control.DataGrid))
        htmlWriter.Write(ControlPersister.PersistControl(control.NextButton))
        htmlWriter.Write(ControlPersister.PersistControl(control.PreviousButton))
       
Return strWriter.ToString
   
End Function

复合控件属性:
 
<PersistenceMode(PersistenceMode.InnerProperty), NotifyParentProperty(True), _
        Description(
"Page Count"), Category("ChildControl")> _
       
ReadOnly Property  pageTextBox() As TextBox
       
Get
           
Me.EnsureChildControls()
           
Return txtPageCount
       
End Get
   
End Property

   
<PersistenceMode(PersistenceMode.InnerProperty), NotifyParentProperty(True), _
        Description(
"DisplayData"), Category("ChildControl")> _
       
ReadOnly Property PageDataGrid() As NotifyDataGrid
       
Get
           
Me.EnsureChildControls()
           
Return dgdList
       
End Get
   
End Property

   
<PersistenceMode(PersistenceMode.InnerProperty), Category("ChildControl"), _
        Description(
"「<」"), _
        NotifyParentProperty(
True)> ReadOnly Property PreviousPageButton() As Button
       
Get
           
Me.EnsureChildControls()
           
Return btnPrevious
       
End Get
   
End Property

<PersistenceMode(PersistenceMode.InnerProperty), Category("ChildControl"), _
        Description(
"「>」"), _
        NotifyParentProperty(
True)> ReadOnly Property NextPageButton() As Button
       
Get
           
Me.EnsureChildControls()
           
Return btnNext
       
End Get
   
End Property

同时重载AddParsedSubObject方法:
Protected Overrides Sub AddParsedSubObject(ByVal obj As Object)
       
Dim idName As Array
       
If TypeOf (obj) Is TextBox Then
           
Me.txtPageCount = obj
       
End If

       
If TypeOf (obj) Is DataGrid Then
           
Me.dgdList = obj
       
End If

       
If TypeOf (obj) Is Button Then
           
            idName
= Split(CType(obj, Button).ID.ToString, "_")
           
           
If idName(1).ToString.Equals("NextPageButton") Then
               
Me.btnNext = obj
           
Else
               
Me.btnPrevious = obj
           
End If
       
End If
   
End Sub
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值