【问题标题】:Directly addressing controls in a UserControl after adding TableLayoutPanel添加 TableLayoutPanel 后直接寻址 UserControl 中的控件
【发布时间】:2013-03-21 18:28:07
【问题描述】:

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

我的问题是,在许多地方,代码直接通过 Controls 字典解决嵌套在用户控件中的控件 - 例如:MyUserControl.Controls["NameOfTextBox"].Visible = false;

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

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

有什么想法吗?

【问题讨论】:

    标签: winforms user-controls tablelayoutpanel


    【解决方案1】:

    我的问题是,在很多地方,代码直接解决了嵌套在用户控件中的控件...

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

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

    然后,您可以直接在 UserControl 中引用控件,但为控件的使用者提供关注点分离。

    【讨论】:

    • 对我来说,为嵌套在用户控件中的每个控件中的每个属性编写一个 getter 看起来非常多余......即使我只为已经从外部代码使用的属性执行此操作,它每次我想更改以前未使用过的属性时,都会强制我编辑用户控件的代码。有人有其他想法吗?
    猜你喜欢
    • 1970-01-01
    • 2011-04-10
    • 2015-05-09
    • 1970-01-01
    • 2012-09-29
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多