C# 自定义用户控件

C# 自定义用户控件,c#,visual-studio-2010,events,user-controls,C#,Visual Studio 2010,Events,User Controls,我在c#中设计了自定义用户控件。此用户控件包括: 文本框、复选框、按钮 现在我想在我的项目中使用设计好的用户控件,但问题是我无法访问文本框、复选框、,使用“我的表单”中的用户控件时按钮事件,并且只有用户控件的事件。如何才能使每个对象事件在使用设计的用户控件时成为可访问的事件?您可能需要手动为那些要从外部访问的控件的事件创建公共事件 另一种方法是,在用户控件中初始化这些控件时,使用public而不是private(由VS自动生成),这些代码应该位于xxx.Designer.cs中,它们看起来像pr

我在c#中设计了自定义用户控件。此用户控件包括: 文本框、复选框、按钮


现在我想在我的项目中使用设计好的用户控件,但问题是我无法访问文本框、复选框、,使用“我的表单”中的用户控件时按钮事件,并且只有用户控件的事件。如何才能使每个对象事件在使用设计的用户控件时成为可访问的事件?

您可能需要手动为那些要从外部访问的控件的事件创建公共事件


另一种方法是,在用户控件中初始化这些控件时,使用public而不是private(由VS自动生成),这些代码应该位于xxx.Designer.cs中,它们看起来像
private System.Windows.Forms.button1
。然后可以通过
MyUserControl.button1
访问它。但是这样做,整个控件将可以从用户控件之外访问,这让个人感觉不太好。

我认为您应该将公共事件添加到自定义控件类中,并在其中进行订阅和取消订阅。就这样,

public event EventHandler ComboboxClick
{
   add { _combobox.Click += value; }
   remove { _combobox.Click -= value; }
}
有关更多信息,请参阅


编辑:我不建议将自定义控件的内部控件设置为公共属性,因为这违反了封装原则。您设计自己的控件来完成某些特定的工作,并且控件的客户端应该不知道其内部组成。如果您将来更改控件的内部组成(例如,切换到某个第三方textbox控件),您只需在自定义控件类中进行更改,其客户端仍将正常工作,就好像什么都没有发生一样。下面是关于封装=)

在用户控件中,将控件(如“文本框”
修改器
属性)设置为
Public
。因此,当您将此用户控件添加到表单中时。您可以通过以下方式访问文本框:

public Form1()
        {
            InitializeComponent();
            userControl11.textBox1.TextChanged += new EventHandler(textBox1_TextChanged);
        }

        void textBox1_TextChanged(object sender, EventArgs e)
        {
            MessageBox.Show("user control textbox.text changed");
        }