【问题标题】:How does a method in a winform listen to an event/delegate in App_Code, and not get a null event?winform 中的方法如何监听 App_Code 中的事件/委托,而不是获取空事件?
【发布时间】: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


【解决方案1】:

也许我明白了。您有两个 Game 类实例:

  1. 在表单中并订阅事件。

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

将您的事件子接收代码移动到按钮单击处理程序,您就完成了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-22
    • 1970-01-01
    • 2019-05-06
    • 1970-01-01
    • 2015-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多