C# 在两个窗体之间访问EventHandler
我想访问Form2中Form1的EventHandler Form1事件处理程序是:-C# 在两个窗体之间访问EventHandler,c#,winforms,event-handling,C#,Winforms,Event Handling,我想访问Form2中Form1的EventHandler Form1事件处理程序是:- private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e) 如何实现它?你做错了什么 如果您想公开功能,您应该创建一个公共方法/函数。您可以从事件处理程序和其他表单调用此函数。您做错了什么 如果您想公开功能,您应该创建一个公共方法/函数。您可以从事件处理程序和其他表单调用此函数。将访问修饰符更改为pu
private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
如何实现它?你做错了什么
如果您想公开功能,您应该创建一个公共方法/函数。您可以从事件处理程序和其他表单调用此函数。您做错了什么
如果您想公开功能,您应该创建一个公共方法/函数。您可以从事件处理程序和其他表单调用此函数。将访问修饰符更改为public而不是private。将访问修饰符更改为public而不是private。根据您在评论中的问题更新了答案,我没有检查它是否正常工作,可能是它有错误: 当您有一个类似的事件时,它很有用,您也可以传递不同的EventArg,最简单的方法是使用不同的属性来确定每个表单,并在它们的
集合方法中添加事件,但下面是通用的
public abstract class FormBase : Form
{
public virtual event EventHandler MyEventHandler;
}
public class Form3 : FormBase
{
public override event EventHandler MyEventHandler;
Form2 instance;
public Form3()
{
instance = Form2.Instance;
instance[this.GetType().ToString()] = this;
// or
//instance["Form3"] = this;
}
private void dataGridView1_CellEndEdit(object sender, EventArgs e)
{
// todo
if (MyEventHandler != null)
MyEventHandler(this, e);
}
}
public class Form2
{
Dictionary<string, FormBase> dic = new Dictionary<string,FormBase>();
public FormBase this[string index]
{
get
{
FormBase retVal = null;
if (dic.TryGetValue(index, out retVal))
return retVal;
return null;
}
set
{
FormBase retVal = null;
if (value == null)
return;
if (dic.TryGetValue(index, out retVal))
{
try
{
value.MyEventHandler -= MyEventHandler1;
}
catch
{
}
retVal = value;
retVal.MyEventHandler += MyEventHandler1;
return;
}
value.MyEventHandler += MyEventHandler1;
dic.Add(index, value);
}
}
private static Form2 instance;
public static Form2 Instance
{
get
{
if (instance == null)
{
instance = new Form2();
}
return instance;
}
}
private Form2()
{
}
private void MyEventHandler1(object sender, EventArgs e)
{
}
}
公共抽象类FormBase:Form
{
公共虚拟事件事件处理程序MyEventHandler;
}
公共类Form3:FormBase
{
公共重写事件处理程序MyEventHandler;
表2实例;
公共表格3()
{
instance=Form2.instance;
实例[this.GetType().ToString()]=this;
//或
//实例[“Form3”]=此;
}
私有void dataGridView1_CellEndEdit(对象发送方,事件参数e)
{
//待办事项
如果(MyEventHandler!=null)
迈文坦德勒(这个,e);
}
}
公开课表格2
{
Dictionary dic=新字典();
公共FormBase此[字符串索引]
{
得到
{
FormBase retVal=null;
if(dic.TryGetValue(索引,输出检索))
返回返回;
返回null;
}
设置
{
FormBase retVal=null;
如果(值==null)
返回;
if(dic.TryGetValue(索引,输出检索))
{
尝试
{
value.MyEventHandler-=MyEventHandler1;
}
抓住
{
}
retVal=值;
retVal.MyEventHandler+=MyEventHandler1;
返回;
}
value.MyEventHandler+=MyEventHandler1;
添加(索引、值);
}
}
私有静态Form2实例;
公共静态Form2实例
{
得到
{
if(实例==null)
{
instance=newform2();
}
返回实例;
}
}
私人表格2()
{
}
私有void MyEventHandler1(对象发送方,事件参数e)
{
}
}
根据您在评论中的问题更新了答案,我没有检查它是否正常工作,可能是它有缺陷:
当您有一个类似的事件时,它很有用,您也可以传递不同的EventArg,最简单的方法是使用不同的属性来确定每个表单,并在它们的集合方法中添加事件,但下面是通用的
public abstract class FormBase : Form
{
public virtual event EventHandler MyEventHandler;
}
public class Form3 : FormBase
{
public override event EventHandler MyEventHandler;
Form2 instance;
public Form3()
{
instance = Form2.Instance;
instance[this.GetType().ToString()] = this;
// or
//instance["Form3"] = this;
}
private void dataGridView1_CellEndEdit(object sender, EventArgs e)
{
// todo
if (MyEventHandler != null)
MyEventHandler(this, e);
}
}
public class Form2
{
Dictionary<string, FormBase> dic = new Dictionary<string,FormBase>();
public FormBase this[string index]
{
get
{
FormBase retVal = null;
if (dic.TryGetValue(index, out retVal))
return retVal;
return null;
}
set
{
FormBase retVal = null;
if (value == null)
return;
if (dic.TryGetValue(index, out retVal))
{
try
{
value.MyEventHandler -= MyEventHandler1;
}
catch
{
}
retVal = value;
retVal.MyEventHandler += MyEventHandler1;
return;
}
value.MyEventHandler += MyEventHandler1;
dic.Add(index, value);
}
}
private static Form2 instance;
public static Form2 Instance
{
get
{
if (instance == null)
{
instance = new Form2();
}
return instance;
}
}
private Form2()
{
}
private void MyEventHandler1(object sender, EventArgs e)
{
}
}
公共抽象类FormBase:Form
{
公共虚拟事件事件处理程序MyEventHandler;
}
公共类Form3:FormBase
{
公共重写事件处理程序MyEventHandler;
表2实例;
公共表格3()
{
instance=Form2.instance;
实例[this.GetType().ToString()]=this;
//或
//实例[“Form3”]=此;
}
私有void dataGridView1_CellEndEdit(对象发送方,事件参数e)
{
//待办事项
如果(MyEventHandler!=null)
迈文坦德勒(这个,e);
}
}
公开课表格2
{
Dictionary dic=新字典();
公共FormBase此[字符串索引]
{
得到
{
FormBase retVal=null;
if(dic.TryGetValue(索引,输出检索))
返回返回;
返回null;
}
设置
{
FormBase retVal=null;
如果(值==null)
返回;
if(dic.TryGetValue(索引,输出检索))
{
尝试
{
value.MyEventHandler-=MyEventHandler1;
}
抓住
{
}
retVal=值;
retVal.MyEventHandler+=MyEventHandler1;
返回;
}
value.MyEventHandler+=MyEventHandler1;
添加(索引、值);
}
}
私有静态Form2实例;
公共静态Form2实例
{
得到
{
if(实例==null)
{
instance=newform2();
}
返回实例;
}
}
私人表格2()
{
}
私有void MyEventHandler1(对象发送方,事件参数e)
{
}
}
另一个选项是将Form1
上的eventhandler解析为Form2
:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
DataGridViewCellEventHandler dataGridViewCellEventHandler = new DataGridViewCellEventHandler(this.dataGridView1_CellEndEdit);
this.dataGridView1.CellEndEdit += dataGridViewCellEventHandler;
Form2 form2 = new Form2();
form2.CellEndEdit += dataGridViewCellEventHandler;
}
private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
//Do something
}
}
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
public event DataGridViewCellEventHandler CellEndEdit
{
add { dataGridViewOnForm2.CellEndEdit += value; }
remove { dataGridViewOnForm2.CellEndEdit -= value; }
}
}
但是,这确实要求Form1
有权访问Form2
另一个选项是将Form1
上的事件处理程序解析为Form2
:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
DataGridViewCellEventHandler dataGridViewCellEventHandler = new DataGridViewCellEventHandler(this.dataGridView1_CellEndEdit);
this.dataGridView1.CellEndEdit += dataGridViewCellEventHandler;
Form2 form2 = new Form2();
form2.CellEndEdit += dataGridViewCellEventHandler;
}
private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
//Do something
}
}
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
public event DataGridViewCellEventHandler CellEndEdit
{
add { dataGridViewOnForm2.CellEndEdit += value; }
remove { dataGridViewOnForm2.CellEndEdit -= value; }
}
}
然而,这确实需要Form1
有权访问Form2
@Oded,我想你是对的,如果我将“private”修饰符修改为“Public”,那么在Form2中如何调用它呢?。请提供一些示例。@mahesh-您不应该以这种方式公开事件处理程序。如果你使用一个公共方法,你只需要一个对它所定义的对象的引用并调用它。你能解释一下你想做什么吗?@a_Nablsi-你的意思是评论这个问题,而不是我的答案吗?@Oded,reference的意思是声明“全局静态对象”,并将公共方法引用放在它上面。@Oded,我想你是对的,如果我将“private”修饰符修改为“Public”,那么在form2中如何称呼它呢?。请提供一些例子。@mahesh-你应该