【发布时间】:2011-09-30 18:31:47
【问题描述】:
场景 -
程序打开一个winForm。用户输入信息,点击开始按钮。动作转移到 App_Code.Model 中的代码。当该代码完成后,winForm 后面的代码需要显示更新的信息。 App_Code.Model 不应该知道 winForm。本例中的 winForm 有一个按钮 btnStart 和一个文本框 tbInput。
但是当事件被引发时,它是空的,所以我做错了什么。请注意,这与从 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";
}
}
}
【问题讨论】:
-
什么是空值?如果调用 PrepareGame() 值将始终 == 2?
-
TableViewChanged 始终为空,'else' 永远不应该执行。
标签: c# winforms events delegates