winform中的方法如何在App_Code中侦听事件/委托,而不是获取null事件?

时间:2011-07-07 19:52:17

标签: c# winforms events delegates

情景 -

程序打开一个winForm。用户输入信息,单击开始按钮。操作转移到App_Code.Model中的代码。当该代码完成时,winForm后面的代码需要显示更新的信息。 App_Code.Model不应该知道winForm。在这种情况下,winForm有一个按钮btnStart和一个文本框tbInput。

但是当事件被引发时,它是null,所以我做错了。注意,这不是关于winForms userControls引发的事件,我知道网上有很多关于它的信息。

App_Code.Model     使用系统;     使用System.Collections.Generic;     使用System.Linq;     使用System.Text;

namespace EventsTest.App_Code.Model
{
    public delegate void TableViewChangeHandler(object sender, HandChangedEventArgs e);

    public class HandChangedEventArgs : EventArgs{
        public int HandNum { get; set; }
        public int PlayerNum { get; set; }
        public HandChangedEventArgs(int handNum, int playerNum){
            HandNum = handNum;
            PlayerNum = playerNum;
        }
    }
    public class Game{
        public event TableViewChangeHandler TableViewChanged;
        public void PrepareGame(){
            int value = -1;
            if (TableViewChanged != null)
                TableViewChanged(this, new HandChangedEventArgs(value, 0));
            else
                value = 2;//used to set toggle to catch debugger
        }
    }
}

代码背后的形式     使用系统;     使用System.Collections.Generic;     使用System.ComponentModel;     使用System.Data;     使用System.Drawing;     使用System.Linq;     使用System.Text;     使用System.Windows.Forms;     使用EventsTest.App_Code.Model;

namespace EventsTest
{
    public partial class testForm : Form{
        public testForm(){
            InitializeComponent();
            Game myGame = new Game();
            myGame.TableViewChanged += this.HandleTableViewChange;
        }
        private void btnStart_Click(object sender, EventArgs e) {
            Game myGame = new Game();
            myGame.PrepareGame();
        }
        public void HandleTableViewChange(object sender, HandChangedEventArgs e){
            this.tbInput.Text = "Raised";
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我可以理解。你有两个Game类实例:

  1. 在表格中,并订阅该活动。

  2. 在btnStart_Click方法中,它不订阅事件并调用PrepareGame(),因此您不会收到事件通知。

  3. 将您的事件子滑动代码移动到按钮点击处理程序,然后就完成了。