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

How to find a Control without knowing the parent control, narrowed by instance (.Net 1.1)

我的任务是更改目前无法升级的旧 .Net 1.1 应用程序。该应用程序的设计非常糟糕,到处都是调用、重复的函数、甚至没有注释掉的未使用代码,以及同一个用户控件的多次迭代,但没有注明实际使用的是哪个控件。使用的用户控件与根本不是用户控件的控件混合在一起,但在中央 Form 中实现时同样复杂。

名为 MainForm 的中央 Form 有一个 TabControl,它本身在每个页面中都有一个 WorkForm。这些是根据用户输入动态生成的。 WorkForm是用户控件,包含前面提到的用户控件和contained/uncontained控件、面板等的大杂烩。完全基于加载的数据,窗体和控件之间的亲子关系可以是动态的,这增加了问题的复杂性。

第 4 个选项卡上 WorkForm 用户控件的一部分的用户控件实例有一个数据网格,我需要做的是修改在该数据网格中添加新行的代码检查用户控件之外的控件,但在相同的 WorkForm 中,并获取其 SelectedValue。我本质上需要 "Where's Waldo" 我需要的控件,但有足够的 "Carmen Sandiego" 来适应无法保证控制层次结构的事实。此外,Demeter 法则更像是 "Law of Demeter? I don't even know her Dename!",因此对应用程序运行方式的静态变量的调用实际上是不应该的。

类似于:

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

由于无法保证关系,因此寻找此控件的最佳方法是什么? P.S。我没有编写应用程序。我只是受困于向这个噩梦添加更改的说明。

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

如果它有名称(或其他类型的唯一条件),您可以像这样对所有容器进行递归搜索:

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;
  }
}

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

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