自定義控件容器框有一個清空方法,其中的代碼是對內部包含的全部自定義控件進行清空操做,例如文本控件,把文本框的內容清空。
我原來在VB中的代碼以下:
Public Sub Clear()
Dim C1 As Control
For Each C1 In UserControl.ContainedControls
Select Case TypeName(C1)
Case "HYText", "HYNum", "HYDate", "HYMText"
If C1.NoClear Then
Else
C1.Text = ""
End If
Case "HYCombo"
If C1.NoClear Then
Else
C1.Text = ""
C1.TextE = ""
End If
Case "HYCheck"
If C1.NoClear Then
ElseIf C1.DefaultValue <> "" Then
C1.Value = C1.DefaultValue
Else
C1.Value = 0
End If
Case "HYOption"
If C1.NoClear Then
Else
C1.Value = 1
End If
Case "HYGrid"
If C1.NoClear Then
Else
C1.ClearGrid
End If
Case "HYPic"
C1.ClearPic
End Select
Next
RaiseEvent AfterClear
End Sub
它存在什麼問題?
·每增長一類控件,我就要在代碼中增長對應的 Case。
·代碼冗長
·清空的事情各式各樣,不在子控件類中完成,而在容器中完成,即容器的編寫者要對各個子控件熟悉(雖然如今子控件與容器控件編寫者是同一人)程序員
改進辦法:「針對接口編程」
C#中,定義一個接口IfConPub(或超類),並定義這個接口的一個方法 ClearValue。編譯器保證全部實現該接口的控件都必須實現這個方法。(VB6沒有這個保證)。這樣編寫子控件的程序員不會忘記實現這個方法。
代碼就簡化爲:
public void Clear()
{
foreach (Control oConTemp in this.Controls)
{
IfConPub oC1 = oConTemp as IfConPub;
if (oC1 !=null )
{
if (oC1.NoClear == true)
{
}
else
{
oC1.ClearValue();
}
}
}編程
if (this.AfterClear != null)
{
this.AfterClear();
}
}this