我如何订阅用户控件的事件

时间:2010-12-13 15:39:47

标签: c# winforms

我有一组用户控件,我在表单中使用了多个实例。 用户控件包含文本框,组合框或复选框以及get值方法,以返回其相应控件的值。通常我在窗体上有一个按钮,其被点击的事件调用usercontrols getValue函数,但是现在我需要在用户控件控件更改事件发生时在窗体上发生某些事情。像下面这样的东西。 在form1.cs

form1.Controls.Add(UserControl1);
form1.Controls.Add(UserContorl2);
// gets called every time the combobox on UserControl1 has it's
// ValueChanged event raised
private void UserControl1_Changed(object Sender, EventArgs e)
{
    form1.property1 = UserControl1.getValue();
}
// gets called everytime the textbox on UserControl2 has it's
// textChanged event raised
private void UserControl2_Changed(object Sender, EventArgs e)
{
    form1.property2 = UserControl2.getValue();
}

我无法弄清楚如何在表单中抛出/捕获该事件。我正在使用VS 2005。

这是我的一个用户控件中的代码。 txtValue是一个文本框

public partial class StringParameterControl : BaseParameterControl
{
    public StringParameterControl(string aName, string aValue)
        : base(aName)
    {
        InitializeComponent();
        txtValue.Text = aValue;
    }
    public StringParameterControl(string aName)
        : base(aName)
    {
        InitializeComponent();
    }
    public StringParameterControl()
        : base()
    {
        InitializeComponent();
    }
    public void SetValue(string aValue)
    {
        txtValue.Text = aValue;
    }
    public override object GetValue()
    {
        return txtValue.Text;
    }
}

3 个答案:

答案 0 :(得分:2)

UserControl1.Changed += UserControl1_Changed;

更新您的控件以包含以下内容:

// A delegate type for hooking up change notifications.
// This is _what kind_ of event you want. It sets the signature your event handler methods must have.
public delegate void ChangedEventHandler(object sender, EventArgs e);

//the actual event
public event ChangedEventHandler Changed;

// Method to raise/fire the Changed event. Call this whenever something changes
protected virtual void OnChanged(EventArgs e) 
{
    ChangedEventHandler handler = Changed;
    if (handler != null) handler(this, e);
}

//and update your existing SetValue() function like so:
public void SetValue(string aValue)
{
    txtValue.Text = aValue;
    OnChanged(EventArgs.Empty);
}

您可以更改事件签名以传递所需的任何信息 - 例如,属性的旧值或新值(或两者)。我只是使用了示例的标准事件参数。

说话或属性,不要像你刚才那样用C#编写单独的Get / Set方法。如果您发现自己这样做,您可能希望使用属性,这将自动强制执行正确的get / set语义:

public string Value 
{ 
    get { return txtValue.Text;} 
    set {txtValue.Text = value; OnChanged(EventArgs.Emtpy); } 
}

答案 1 :(得分:0)

据我所知,您使用的用户控件不会在其值发生变化时触发事件,因此您不能只订阅某些“ValueChanged”事件。 一个可能的解决方案可能是在usercontrols的“Controls”集合中找到您感兴趣的控件(Combobox,Textbox等),并直接订阅其相应的事件。

答案 2 :(得分:0)

或者您可以使用类型推断样式。

       UserControl.Changed = (sender, e) => this.controlFired = true; //or whatever

Changed是您通过控件中的属性公开的公共事件,其中包含委托的类型(void(object sender,EventArges e)​​)。你可以查看如何在msdn上发布这个事件 - 有很多关于这个的文章。