情景 -
程序打开一个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";
}
}
}
答案 0 :(得分:0)
我可以理解。你有两个Game类实例:
在表格中,并订阅该活动。
在btnStart_Click方法中,它不订阅事件并调用PrepareGame(),因此您不会收到事件通知。
将您的事件子滑动代码移动到按钮点击处理程序,然后就完成了。