单击按钮并在另一个类中将其订阅到eventhandler时引发事件?

时间:2013-02-23 06:19:59

标签: c# winforms events event-handling

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

基本上,当单击按钮时,它应该引发一个事件,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中的文本传回形式?

感谢任何帮助..谢谢

1 个答案:

答案 0 :(得分:4)

您只需要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

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

这可以按您想要的方式工作:我不再需要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));
    }