如何使用事件来访问表单的控件?

时间:2012-12-04 02:09:53

标签: c# winforms class events

我正在寻找一个类如何使用事件回调父窗体控件的示例。在这种情况下,事件将发生在类中,而不是父类。例如,如果您有一个类,并且类中发生了需要更新表单文本框的内容。

我通过将表单的文本框作为属性公开然后将表单的实例传递给类来完成此操作,但这似乎只是为了更新文本框而做了很多工作。

我正在尝试自学C#所以我是新手。 肯

4 个答案:

答案 0 :(得分:2)

public class Form1 : Form
{
    EventClass eventClassInstance;

    public Form()
    {
        eventClassInstance = new EventClass();
        eventClassInstance.actualEvent += new EventClass.CustomEventHandler(eventHandler);
    }

    private void eventHandler(object sender)
    {
        //Do something
    }
}

public class EventClass
{
    public delegate void CustomEventHandler(object sender);
    public CustomEventHandler actualEvent;// This gets fired somewhere

    public EventClass()
    {

    }
}

这是父类中事件处理程序的一个简单示例。

答案 1 :(得分:1)

您可能希望在发布活动时查看此MSDN article。根据您想要传递的信息,您可能需要创建一个Custom EventArgs来传递信息,然后创建您的委托和事件。

这是一个快速而肮脏的例子,在上面的MSDN Link上大量借用,添加了Timer以进行快速测试:

<强> Form1中

public partial class Form1 : Form
{

    public Form1()
    {
        InitializeComponent();
        Class1 myClass = new Class1();
        myClass.RaiseCustomEvent += new EventHandler<CustomEventArgs>(myClass_RaiseCustomEvent);

    }

    void myClass_RaiseCustomEvent(object sender, CustomEventArgs e)
    {
        this.Text = e.Message;
    }

}

<强>的Class1

using System.Windows.Forms;
namespace WindowsFormsApplication1
{
    class Class1
    { 
        public event EventHandler<CustomEventArgs> RaiseCustomEvent;
        public Class1()
        {
            Timer tmr = new Timer();
            tmr.Tick += new EventHandler(tmr_Tick);
            tmr.Interval = 2000;
            tmr.Start();
        }

        void tmr_Tick(object sender, EventArgs e)
        {
            CustomEventArgs ea = new CustomEventArgs("Hello World");
            RaiseCustomEvent(this, ea);
        }

    }

    public class CustomEventArgs : EventArgs
    {
        public CustomEventArgs(string s)
        {
            msg = s;
        }
        private string msg;
        public string Message
        {
            get { return msg; }
        }
    }
}

答案 2 :(得分:0)

尝试遵循此过程:

  1. 在数据类中公开事件
  2. 当文本框需要更新时,触发事件
  3. 以父表格
  4. 收听活动
  5. 在事件处理程序中,更新文本框

答案 3 :(得分:0)

不确定您的类将如何触发其更新操作。因此,让我们考虑一个简单的案例,用户可以单击按钮来调用类来执行某些操作。您可以将表单中的回调传递给类,如下所示:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Class1 class1 = new Class1();
        class1.DoSomething(OnSuccess, OnError);
    }

    private void OnSuccess(string newValue)
    {
        textBox1.Text = newValue;
    }

    private void OnError(Exception ex)
    {
        MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

该类将完成其任务并将更新的值传递给回调,而不知道调用者将如何处理更新的值:

public class Class1
{
    public void DoSomething(Action<string> onSuccess, Action<Exception> onError)
    {
        try
        {
            // Logic to really do something...

            if (onSuccess != null)
                onSuccess("updated value");
        }
        catch (Exception ex)
        {
            if (onError != null)
                onError(ex);
        }
    }
}

如果你已经学习了lambda表达式,你可以动态地将回调传递给你的班级:

private void button1_Click(object sender, EventArgs e)
{
    Class1 class1 = new Class1();
    class1.DoSomething(
        newValue => textBox1.Text = newValue,
        ex => MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error));
}