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

3
我有一个包含按钮和文本框的form.cs文件,还有一个处理当点击按钮时触发的事件的类。
基本上,当按下按钮时,它应该触发一个事件,并且Print类中的事件处理程序应该将文本打印到表单中的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";
    }
}

看起来没有触发任何事件..我认为我引发事件或订阅事件处理程序的方式是错误的。那么我如何将事件处理程序中的文本传递回表单呢?

非常感谢您的帮助。

1个回答

4
您只需要为Button.Click事件添加一个额外的事件订阅即可。
   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;

    }
}

我不太明白的一件事是,如果你需要在同一个表单上输出结果,为什么需要一个额外的类。

我的建议是,不要创建一个额外的类来处理所有的Button.Click事件。

这样可以达到你想要的效果:我去掉了需要额外类的需求。

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

我需要另一个类的原因是,我有一些数据需要处理,因此当单击按钮时,它应该通知该类进行处理并返回输出。我希望这很清楚。 - Liban
@Liban - 那么,在这种情况下,答案的上半部分就足够了! - Parimal Raj
是的,我正在做那个...那返回值到表单上怎么样(输出到文本框)? - Liban
@Liban - 在PrintClass中添加一个字段,如internal TextBox outputBox;并访问控件! - Parimal Raj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接