• 设计模式应用之一:控件清空


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

  • 相关阅读:
    史上最容易听错的歌词
    笑话
    商贸通转入EXCEL中的账查不能自动进行合计
    XP登陆后自动注销!
    在Windows系统上如何安装虚拟网卡
    全球最佳造句奖
    一个电脑白痴和黑客的对话
    光棍与非光棍的N条区别
    『转』组合数快速算法!!!
    中国剩余定理
  • 原文地址:https://www.cnblogs.com/yzx99/p/3360211.html
Copyright © 2020-2023  润新知