Winforms 添加TableLayoutPanel后直接寻址UserControl中的控件

Winforms 添加TableLayoutPanel后直接寻址UserControl中的控件,winforms,user-controls,tablelayoutpanel,Winforms,User Controls,Tablelayoutpanel,我最近在我的WinForms项目中重构了一个用户控件的代码,并将其从一个带有文本框、组合框和按钮的用户控件更改为一个用户控件,该控件现在包含一个TableLayoutPanel,可以更好地保存所有控件 我的问题是,在许多地方,代码通过控件字典直接寻址嵌套在用户控件中的控件,例如:MyUserControl.controls[“NameOfTextBox”]。Visible=false 现在,在我将文本框和按钮嵌套在TableLayoutPanel中之后,我不能再进行这种寻址,现在我应该编写MyU

我最近在我的WinForms项目中重构了一个用户控件的代码,并将其从一个带有文本框、组合框和按钮的用户控件更改为一个用户控件,该控件现在包含一个TableLayoutPanel,可以更好地保存所有控件

我的问题是,在许多地方,代码通过控件字典直接寻址嵌套在用户控件中的控件,例如:
MyUserControl.controls[“NameOfTextBox”]。Visible=false

现在,在我将文本框和按钮嵌套在TableLayoutPanel中之后,我不能再进行这种寻址,现在我应该编写
MyUserControl.Controls[0]。Controls[“NameOfTextBox”]。Visible=false,否则会出现异常

我的问题是,我是否应该在每个地方更改处理用户控件内容的所有代码,或者您是否可以为我提供一些在用户控件本身上实现的变通方法,以便在我尝试直接处理控件时,它会将其转发到TableLayoutPanel的内容

有什么想法吗

我的问题是,在许多地方,代码直接处理嵌套在用户控件中的控件

这可能是核心问题。请尝试为您的UserControl创建属性:

public bool NameBoxVisible {
  get { return NameOfTextBox.Visible; }
  set { NameOfTextBox.Visible = value; }
}

然后,您可以直接在UserControl中引用控件,但要为控件的使用者提供一个独立的关注点。

对于我来说,为嵌套在用户控件中的每个控件中的每个属性编写getter看起来非常麻烦。。。即使我只对已经从外部代码中使用的属性执行此操作,每次我想要更改以前未使用过的属性时,它都会强制我编辑用户控件的代码。有人有别的想法吗?