zoukankan      html  css  js  c++  java
  • C#中控件数组的讨论

    VB用得习惯后,到C#中来觉得很奇怪,如此好的控件数组怎么不见了。
    “众所周知,控件数组最主要的两个优点:可以循环附值;可以响应同一个事件。从而大大简化了代码。
    引自
    http://wenku.baidu.com/view/769c436b561252d380eb6e72.html

    但该文提出的方法仍然不适合我的这种情况:比如一个按钮,一个文本框,界面上放上好几对(我放6对)
    然后,希望实现的功能是点击一个按钮,对应的文本框内容显示“OK”

    按钮点击:
    这个用于处理代码比较少的,界面对数比较少的。

    如果处理代码比较多,一般再把代码变为子程序。

    但处理的事件子程序还是一样的多

    把按钮的处理事件都指向同一个事件处理过程,差异就是控件,sender就是激发控件的事件?但与其对应的文本控件是谁?

    一般方法是界面装载时,把实际的控件装载到控件数组中去。如果要一行行地装载
      TextBox[] myTextBox = new TextBox[5];
      myTextBox[0] = textBox1;
      myTextBox[1] = textBox2;
      myTextBox[2] = textBox3;
      myTextBox[3] = textBox4;
      myTextBox[4] = textBox5; 
    估计自己写得要发疯

    改进一步:因为窗体里的控件,都被包括在Controls中,所以可以根据其控件名加以区分。定义控件名称除了最后一位(或两位)为数字索引,前面部分必须相同。这样在代码中即可分解索引。示例代码如下:
    FrmCXFA_Load 时
    foreach (Control oCon in this.Controls)
    {
      int lNameLength = oCon.Name.Length;
      int lIndex = FVB.Val(oCon.Name.Substring(lNameLength - 1));
      switch (oCon.Name.Substring(0, oCon.Name.Length - 1))
      {
        case "txtLab":
          this.txtLab[lIndex] = (TextBox)oCon;
          break;
        case "txtInputField":
          this.txtInputField[lIndex] = (TextBox)oCon;
          break;
        case "cmbClear":
          this.cmbClear[lIndex] = (Button)oCon;
          break;
      }
    }

    CmdClear_Click 时
      int lNameLength = (sender as Button).Name.Length;
      int lIndex = FVB.Val((sender as Button).Name.Substring(lNameLength - 1));

      this.txtLab[lIndex].Text = string.Empty;
      this.txtInputField[lIndex].Text = string.Empty;

    还有一个方案:在程序中即可创建,但该方案对界面设计比较不方便,不是所见即所得,代码量也大,所以不讨论它。

    总结:
    原始解决方案:程序中创建控件数组(不是所见即所得,代码量大)
    更好解决方案:程序装载中控件数组关联到实际控件(简单的代码重复)
    最好解决方案:控件命名有规则,程序装载时遍历界面所有控件,自动关联

  • 相关阅读:
    子查询
    视频工作工具链
    视频拆帧与组帧
    二叉树
    回溯法
    windows配置编译器
    C++工厂模式
    C++单例模式
    HTML学习记录
    C++代码规范
  • 原文地址:https://www.cnblogs.com/yzx99/p/3367547.html
Copyright © 2011-2022 走看看