【问题标题】:Add delegate to Windows Form将委托添加到 Windows 窗体
【发布时间】:2017-06-13 21:13:14
【问题描述】:

问题:我想将相同的消息写入文本框控件,就像写入日志文件一样。

我有一个调用静态方法横切类的 Windows 窗体 (Form1.cs)。在每个横切方法中,他们调用 WriteLogEntry 来更新他们正在做什么的日志文件。我想向 Form1 发回一个事件,这样我就可以将相同的日志消息写入表单上的控件。

我查看了事件,但理解不够,无法理解这些示例,也没有找到一个足够简单的示例来做我想做的事。有人可以给我看一个简单的例子,说明如何在我的代码中添加一个事件来完成这个吗?

namespace MainForm
{
    public delegate void MyDel(string str);

    public partial class Form1 : Form
    {
        public event MyDel MyEvent;

        public Form1()
        {
            InitializeComponent();

            MyEvent += new MyDel(WriteSomething);

            Crosscutting.DoSomething();
        }

        public void WriteSomething(string message)
        {
            Console.WriteLine(message);
        }
    }

    //Crosscutting.cs

    public class Crosscutting
    {
        private static void WriteLogEntry(string message)
        {
             // Code to write message to log file.
        }

        public static void DoSomething()
        {
            WriteSomething obj = new WriteSomething();

            // Code to do something.

            WriteLogEntry("I'm doing something");
        }
    }
}

【问题讨论】:

  • 有很多关于如何编写Events as well as Delegates 的示例,这不是要问如何做一些您可以轻松搜索并找到 1000 个示例的论坛
  • 您至少应该尝试将事件添加到您的代码中。当您将收到错误或其他类型的意外结果时,请返回并寻求解决您的问题的帮助。您当前的问题没有任何问题需要解决
  • @Wannabe 你在DoSomething() 方法中有一段奇怪的代码:WriteSomething obj = new WriteSomething(); - 应该删除。
  • Stack Overflow 是获得帮助的好地方。感谢 sergeyBerezovdkiy 提供的帮助。 @ModernMan,这是一个学习的地方,我说我不知道​​该怎么做……谢谢你责备我什么都不知道也找不到答案。

标签: c# winforms events


【解决方案1】:

在无法弄清楚如何使用委托返回表单后,我尝试了另一种方法。通过在“MyClass”上创建 Form1 的实例,我能够使用公共方法写回表单。不是我想要的方式,但它是现在完成它的一种方式。如果有人可以解释如何更好地做到这一点,请这样做。

public partial class Form1 : Form
{
    private string message = string.Empty;

    public static Form1 form;

    public Form1()
    {
        InitializeComponent();

        form = this;
    }

    public void UpdateTextBox(string message)
    {
        textBox1.Text += message + Environment.NewLine;

        this.Update();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        var myClass = new MyClass();

        myClass.DoSomething();
    }
}


public class MyClass
{
    public void DoSomething()
    {
        Log("I did something");
    }

    private void Log(string message)
    {
        Console.WriteLine(message);

        Form1.form.UpdateTextBox(message);
    }
}

【讨论】:

    猜你喜欢
    • 2020-10-19
    • 2012-05-17
    • 1970-01-01
    • 1970-01-01
    • 2013-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多