自定义控件容器框有一个清空方法,其中的代码是对内部包含的所有自定义控件进行清空操作,例如文本控件,把文本框的内容清空。
我原来在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();
}
}