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

Posted

技术标签:

【中文标题】winform 中的方法如何监听 App_Code 中的事件/委托,而不是获取空事件?【英文标题】:How does a method in a winform listen to an event/delegate in App_Code, and not get a null event? 【发布时间】: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' 永远不应该执行。 【参考方案1】:

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

    在表单中并订阅事件。

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

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

【讨论】:

以上是关于winform 中的方法如何监听 App_Code 中的事件/委托,而不是获取空事件?的主要内容,如果未能解决你的问题,请参考以下文章

C# winform 程序 如果实现监听数据库的某张表

无法从 ASP.Net 网站项目中的代码访问 App_Code 中的类

网站和 App_Code 无法正常工作 (#C)

c# winform 中如何写事件监听 比如监听listview.items.count是不是发生变化

对 Asp.Net App_Code 文件夹中的源代码进行更改时,Visual Studio 挂起

我的网络中的“App_Code”文件夹无法正常工作