0

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

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

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

4

4 回答 4

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()
    {

    }
}

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

于 2012-12-04T02:21:54.667 回答
1

您可能想查看有关发布事件的MSDN 文章。根据您想要传递的信息,您可能需要创建一个自定义 EventArgs 来传递信息,然后创建您的委托和事件。

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

表格1

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;
    }

}

第一类

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; }
        }
    }
}
于 2012-12-04T02:19:17.790 回答
0

尝试遵循此过程:

  1. 在数据类中公开事件
  2. 当文本框需要更新时,触发事件
  3. 监听父窗体中的事件
  4. 在事件处理程序中,更新文本框
于 2012-12-04T02:16:54.180 回答
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));
}
于 2012-12-04T02:56:23.730 回答