首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >简单的自定义事件

简单的自定义事件
EN

Stack Overflow用户
提问于 2011-07-11 06:47:58
回答 3查看 154.8K关注 0票数 76

我正在尝试学习自定义事件,并尝试创建一个,但似乎遇到了问题

我已经创建了一个窗体、静态类和自定义事件。我试图实现的是,当我按下按钮时,Form会调用静态类函数,然后func会不时地引发一个事件来报告当前状态。如果事件被引发,Form1将侦听,如果引发,它将更改label1的文本

这是我到目前为止所掌握的

代码语言:javascript
复制
public partial class Form1 : Form
{
    public EventHandler<Progress> progress; 

    public Form1()
    {
        InitializeComponent();
        progress += SetStatus;
    }

    private void SetStatus(object sender, Progress e)
    {
        label1.Text = e.Status;
    }

    private void button1_Click_1(object sender, EventArgs e)
    {
         TestClass.Func();
    }

 }

文件2

代码语言:javascript
复制
class TestClass
{
    public static void Func()
    {
        //time consuming code
        Report status 
        // time consuming code
        report status
    }
}

public class Progress : EventArgs
{
    public string Status { get; private set; }

    private Progress() {}

    public Progress(string status)
    {
        Status = status;
    }
}

现在我不明白的是,如何从TestClass中引发事件,以便Form1可以处理事件并更改label.Text

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-07-11 07:22:01

这是创建自定义事件并引发它们的一种简单方法。在要引发的类中创建一个委托和一个事件。然后从代码的另一部分订阅事件。您已经有了一个自定义的事件参数类,所以您可以在此基础上构建其他事件参数类。注:我没有编译这段代码。

代码语言:javascript
复制
public partial class Form1 : Form
{
    private TestClass _testClass;
    public Form1()
    {
        InitializeComponent();
        _testClass = new TestClass();
        _testClass.OnUpdateStatus += new TestClass.StatusUpdateHandler(UpdateStatus);
    }

    private void UpdateStatus(object sender, ProgressEventArgs e)
    {
        SetStatus(e.Status);
    }

    private void SetStatus(string status)
    {
        label1.Text = status;
    }

    private void button1_Click_1(object sender, EventArgs e)
    {
         TestClass.Func();
    }

}

public class TestClass
{
    public delegate void StatusUpdateHandler(object sender, ProgressEventArgs e);
    public event StatusUpdateHandler OnUpdateStatus;

    public static void Func()
    {
        //time consuming code
        UpdateStatus(status);
        // time consuming code
        UpdateStatus(status);
    }

    private void UpdateStatus(string status)
    {
        // Make sure someone is listening to event
        if (OnUpdateStatus == null) return;

        ProgressEventArgs args = new ProgressEventArgs(status);
        OnUpdateStatus(this, args);
    }
}

public class ProgressEventArgs : EventArgs
{
    public string Status { get; private set; }

    public ProgressEventArgs(string status)
    {
        Status = status;
    }
}
票数 141
EN

Stack Overflow用户

发布于 2011-07-11 06:57:25

您尚未创建事件。要执行此操作,请编写:

代码语言:javascript
复制
public event EventHandler<Progress> Progress;

然后,您可以从类中调用Progress,就像普通函数或委托一样声明它:

代码语言:javascript
复制
Progress(this, new Progress("some status"));

因此,如果你想在TestClass中报告进度,事件也应该在那里,它也应该是静态的。您可以从表单中订阅它,如下所示:

代码语言:javascript
复制
TestClass.Progress += SetStatus;

此外,您可能应该将Progress重命名为ProgressEventArgs,以便清楚它是什么。

票数 21
EN

Stack Overflow用户

发布于 2011-07-11 07:38:35

如前所述,进度字段需要关键字event

代码语言:javascript
复制
public event EventHandler<Progress> progress;

但我不认为这是你真正想要的活动。我认为你实际上想要的是TestClass的活动。下面的代码看起来怎么样?(我实际上从未尝试过设置静态事件,因此我不确定下面的代码是否可以编译,但我认为这可以让您了解您应该针对的模式。)

代码语言:javascript
复制
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        TestClass.progress += SetStatus;
    }

    private void SetStatus(object sender, Progress e)
    {
        label1.Text = e.Status;
    }

    private void button1_Click_1(object sender, EventArgs e)
    {
         TestClass.Func();
    }

 }

public class TestClass
{
    public static event EventHandler<Progress> progress; 

    public static void Func()
    {
        //time consuming code
        OnProgress(new Progress("current status"));
        // time consuming code
        OnProgress(new Progress("some new status"));            
    }

    private static void OnProgress(EventArgs e) 
    {
       if (progress != null)
          progress(this, e);
    }
}


public class Progress : EventArgs
{
    public string Status { get; private set; }

    private Progress() {}

    public Progress(string status)
    {
        Status = status;
    }
}
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6644247

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档