【问题标题】:What is the proper way to access Controls properties of User Controls in Winform?在 Winform 中访问用户控件的控件属性的正确方法是什么?
【发布时间】:2012-04-29 07:44:41
【问题描述】:

我创建了这个用户控件:

我将该用户控件添加到主窗体,现在我想自定义它。 所以我必须向这 3 个按钮添加文本、标签中的文本、填充 ListBox 并为按钮设置单击事件。

这样做的正确方法是什么?

我在网上环顾四周,显然这样做的方法是在用户控件中添加公共属性,这将公开我需要的单个控件属性。

类似:

    public string Button1Text
    {
        get
        {
            return btn1.Text;
        }
        set
        {
            btn1.Text = value;
        }
    }

如果我走这条路,我将不得不为这个简单的用户控件添加相当多的公共属性。

但是像这样在用户控件中公开整个控件不是更容易吗?

    public Button MyButton1
    {
        get { return this.btn1; }
        set { this.btn1 = value; }
    }

这样主窗体可以根据需要简单地访问控件及其属性。

【问题讨论】:

    标签: c# .net winforms user-controls


    【解决方案1】:

    从封装的角度来看,第一种方法更好。第二种方法使您的控件的用户(窗体)依赖于您的控件的视图,这可以防止将来更改视图。

    【讨论】:

    • 但是比简单的TextBox更复杂的ListBox怎么办?它有许多我也想访问的属性,例如 DataSource、DisplayMember、Items、SelectedIndex、SelectedItem、SelectedItems、SelectedValue,... 我要公开每个属性吗?如果是这样,那与第二种方法有何不同?在这两种情况下,表单都与 ListBox 相关联。还是我应该以不同的方式封装?
    • 我认为您以这种方式导出属性越多,您创建的依赖项就越多。试着抽象一下。另外我建议你学习 WPF 并遵循 MVVM 指令。
    【解决方案2】:

    代码的第一位是正确的方法。您将不得不创建很多它们,但这是正确的方法。

    【讨论】:

      【解决方案3】:

      第一个要好得多,您只需为希望能够从父控件访问的按钮的每个单独属性创建属性。

      如果您使用第二种方式,那么任何希望使用您的控件的人都可以在您的控件中移动各个控件并调整其大小。那么它就真的不再是自定义控件了,而更像是一个比面板更难使用的面板。我想不出任何理由为什么能够允许父级在子控件中移动各个元素。

      【讨论】:

      • 我创建了有问题的用户控件,因为我在应用程序的几个地方需要这些控件组,所以创建空白用户控件并让主窗体可以访问它对我来说很有意义子控件。
      猜你喜欢
      • 2010-12-22
      • 1970-01-01
      • 2011-01-16
      • 2017-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      相关资源
      最近更新 更多