我在 c# 中设计了自定义用户控件。这个用户控件包括:文本框、复选框、按钮。
现在我想在我的项目中使用设计的用户控件,但问题是在我的表单中使用用户控件时我无法访问文本框、复选框、按钮事件,并且只有用户控件的事件。我怎样才能使它成为可能当使用设计的用户控件时,每个对象事件都变得可访问?
我在 c# 中设计了自定义用户控件。这个用户控件包括:文本框、复选框、按钮。
现在我想在我的项目中使用设计的用户控件,但问题是在我的表单中使用用户控件时我无法访问文本框、复选框、按钮事件,并且只有用户控件的事件。我怎样才能使它成为可能当使用设计的用户控件时,每个对象事件都变得可访问?
在您的用户控件中,将您的控件(如“文本框”Modifiers
属性)设置为Public
.so 当您将此用户控件添加到表单时。您可以访问您的文本框事件:
public Form1()
{
InitializeComponent();
userControl11.textBox1.TextChanged += new EventHandler(textBox1_TextChanged);
}
void textBox1_TextChanged(object sender, EventArgs e)
{
MessageBox.Show("user control textbox.text changed");
}
您可能需要为您希望从外部访问的那些控件的事件手动创建公共事件。
另一种方法是,在您的用户控件中初始化这些控件时,使用公共而不是私有(由 VS 自动生成),这些代码应该位于 xxx.Designer.cs 中,它们看起来像private System.Windows.Forms.Button button1
. 然后就可以通过MyUserControl.button1
. 但是这样做,整个控件将可以从您的用户控件之外访问,个人感觉不太好。
我认为您应该将公共事件添加到您的自定义控件类中,并在那里进行订阅和取消订阅。就像这样:
public event EventHandler ComboboxClick
{
add { _combobox.Click += value; }
remove { _combobox.Click -= value; }
}
有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/8627sbea(v=vs.71).aspx
编辑:我不建议将自定义控件的内部控件设置为公共属性,因为它违反了封装原则。您设计自己的控件来完成某些特定的工作,并且控件的客户应该不知道其内部构成。如果您将来更改控件的内部组成(例如,切换到某个 3rd 方文本框控件),您只需在自定义控件类中进行更改,其客户端仍然可以正常工作,就好像什么都没发生一样。这是一个关于封装的好公案=)