单击按钮时引发事件,并将其订阅到另一个类中的事件处理程序

本文关键字:另一个 程序 事件处理 按钮 事件 单击 | 更新日期: 2023-09-27 18:00:46

我有一个包含按钮和texbox的form.cs,还有一个处理单击按钮时引发的事件的类。

基本上,当单击按钮时,它应该引发一个事件,Print类中的eventHandler应该以的形式将文本打印到TboxPrint

我的代码是这样的:

//Declare the delegate
public delegate void EventHandler(object sender, EventArgs e);
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    //event
    public event EventHandler Print;
    //Event caller, protected to prevent calling from other classes
    protected virtual void OnPrint(System.EventArgs e)
    {
        if (Print != null) Print(this, e);
    }
    //raising event
    public bool print_action(object value)
    {
        OnPrint(EventArgs.Empty);
        return true;
    }
    public void BtnPrint_Click(object sender, EventArgs e)
    {
        PrintClass p = new PrintClass();
        Form1 s = new Form1();
        s.Print += p.printEventHandler;
        print_action(true);
    }
}

并且具有处理事件的方法的类是:

class PrintClass
{
    public void printEventHandler(object sender, EventArgs e)
    {
        string text = "Print Event occured";
    }
}

显然什么都没提。。我认为我引发事件或订阅事件处理程序的方式是错误的。以及如何将eventhandler中的文本传递回表单?

任何帮助都将不胜感激。。感谢

单击按钮时引发事件,并将其订阅到另一个类中的事件处理程序

您只需要和extra event subscriptionButton.Click event

   private void Form1_Load(object sender, EventArgs e)
   {
        p = new PrintClass();
        button1.Click += cls.printEventHandler;
   }

要处理表单上的所有按钮,您可以编写一个类似的简单片段

public Form1()
{
    InitializeComponent();
    foreach (Button btn in Controls.OfType<Button>())
    {
        btn.Click += cls.printEventHandler;
    }
}

要知道点击了哪个按钮,可以将PrintClass写入

class PrintClass
{
    public void printEventHandler(object sender, EventArgs e)
    {
         Button btn = (Button) sender;
         //btn.Name <-- Control name;
         //btn.Text<-- Control Text;
    }
}

我不明白的一件事是,如果你需要在同一个表单上输出结果,为什么你需要extra class

我的建议是,不要只为处理所有Button.Click事件而创建extra class

这可以按照你想要的方式工作:我正在消除对extra class 的需求

    public Form1()
    {
        InitializeComponent();
        foreach (Button btn in Controls.OfType<Button>())
        {
            btn.Click += HandleAllButtonClicks;
        }
    }
    private void HandleAllButtonClicks(object sender, EventArgs e)
    {
        Button btn = (Button) sender;
        TboxPrint.AppendText(String.Format("Button Clicked : Name = {0}, Text = {1}", btn.Name, btn.Text));
    }