c# – 如何避免将事件提升到封闭状态?
我无法处理将事件提升到封闭状态并希望得到一些帮助的情况.
场景(见下面的代码供参考): > Form1打开Form2 在Form1.form2_FormAction中,为什么这会返回对Form1的引用,但button1.Parent返回null?他们不应该返回相同的参考? 如果我们省略步骤3,则this和button1.Parent都返回相同的引用. 这是我正在使用的代码…… Form1中: public partial class Form1 : Form { public Form1 () { InitializeComponent(); } private void button1_Click ( object sender,EventArgs e ) { // Create instance of Form2 and subscribe to the FormAction event var form2 = new Form2(); form2.FormAction += form2_FormAction; form2.Show(); } private void form2_FormAction ( object o ) { // Always returns reference to Form1 var form = this; // If Form1 is open,button1.Parent is equal to form/this // If Form1 is closed,button1.Parent is null var parent = button1.Parent; } } 窗体2: public partial class Form2 : Form { public Form2 () { InitializeComponent(); } public delegate void FormActionHandler ( object o ); public event FormActionHandler FormAction = delegate { }; private void button1_Click ( object sender,EventArgs e ) { FormAction( "Button clicked." ); } } 理想情况下,我希望避免将事件发送到已关闭/处理的表单(我不确定是否可能),或者在调用者(在本例中为Form1)中找到一种干净的处理方式. 任何帮助表示赞赏. 解决方法
一个简单的解决方案是使用覆盖所有者的覆盖来显示您的Form2实例:
form2.Show(this); 这将确保在关闭form1时关闭form2.无论如何,在多表单应用程序中通常都是很好的做法,因此您没有任何无主的表单. 更新:事件模型只是处理表单之间通信的一种方式.在你的情况下,它不是真的合适,因为接收事件的表单可以关闭,而不会提升事件意识到它. 另一种方法是使用构造函数编写Form2,该构造函数包含Form1的一个实例作为参数(它将保存为表单级成员,如_Receiver或其他东西).在检查是否已经处理了_Receiver之后,Form2将调用Form1中定义的方法,而不是引发事件: if (!_Receiver.IsDisposed) { _Receiver.SomeMethod("some method"); } 如果您的Form1实例仍然存在,将调用其方法;如果它被关闭并处理掉,它的方法就不会被调用.由于Form2仍然存在,您还可以将_Receiver变为公共属性,并随时将其“所有者”设置为其他Form1. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 判断一组数字是否是Pythagorean Triple/Quadruple
- C++中利用结构体解决选票统计问题
- sqlite3加密方案sqlcipher,及sqlcipher使用指南
- XML 元素 http://blog.csdn.net/chaiyu2002/article/detail
- JSON.parse()和JSON.stringify()
- xml Schema
- ruby-on-rails – Rails:如何将新创建的用户的电子邮件地址
- Cocos2d-X中使用ProgressTimer实现一些简单的效果
- makefile – make:禁用某些目标的并行执行
- react-native – 无法以本机方式访问本地媒体