如何在不知道父控件的情况下查找控件,按实例缩小(.Net 1.1)

时间:2017-05-22 15:18:19

标签: vb.net winforms .net-1.1

我的任务是更改此时无法升级的旧.Net 1.1应用程序。应用程序设计非常糟糕,遍布各处的呼叫,重复的功能,未被注释掉的未使用的代码,以及相同用户控件的多次迭代,而不记录实际使用的是哪一个。所使用的用户控件与完全不是用户控件的控件混合,但在中心Form中实现时同样复杂。

名为Form的中央MainForm有一个TabControl,每个页面中都有一个WorkForm。这些是从用户输入动态生成的。 WorkForm是一个用户控件,包含之前提到的用户控件和包含/未包含的控件,面板等的大杂烩。完全基于正在加载的数据,父母在表单和控件之间可以是动态的,这增加了问题的复杂性。

作为第4个选项卡上WorkForm用户控件的一部分的用户控件的实例有一个数据网格,我需要做的是修改在该数据网格中添加新行的代码以进行检查用户控件之外的控件,但在同一个WorkForm中,并获取其SelectedValue。我基本上需要"哪里有Waldo"我需要的控制,但有足够的" Carmen Sandiego"适应控制层次不受保证的事实。此外,德米特的这个定律更像是德米特定律?我甚至都不知道她的Dename!"所以kludgy调用静态变量并不是应用程序的运行方式。

类似的东西:

Dim row as DataRow = aDataTable.NewRow()
    row[12] = Me.Parent.Cousin.TwiceRemoved.OnFathersSide.NotThatOne _
              .TheOtherOne.SelectedValue

关于这种控制的最佳方法是什么,因为关系不能得到保证?附:我没有写这个应用程序。我只是坚持使用说明为这场噩梦添加更改。

1 个答案:

答案 0 :(得分:0)

这完全取决于您对控件的了解。

如果它有一个名称(或其他类型的唯一标准),您可以对所有容器进行递归搜索,如下所示:

public static Control WhereInTheFormIsWaldoSandiego(Container c, String name)
{
  foreach (Control ctrl in c.Controls)
  {
    if (ctrl.Name.Equals(name)) return ctrl;
    if (ctrl is Container)
    {
      Control inner = WhereInTheFormIsWaldoSandiego(ctrl as Container, name);
      if (inner != null) return ctrl;
    }
    return null;
  }
}

否则你最好的选择可能是找到放置控件的逻辑并修改它以在某处存储对它的引用。

后者可能更可取,因为它可以让您更好地了解应用程序,但也可能需要更长的时间。