Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在两个窗体之间访问EventHandler_C#_Winforms_Event Handling - Fatal编程技术网

C# 在两个窗体之间访问EventHandler

C# 在两个窗体之间访问EventHandler,c#,winforms,event-handling,C#,Winforms,Event Handling,我想访问Form2中Form1的EventHandler Form1事件处理程序是:- private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e) 如何实现它?你做错了什么 如果您想公开功能,您应该创建一个公共方法/函数。您可以从事件处理程序和其他表单调用此函数。您做错了什么 如果您想公开功能,您应该创建一个公共方法/函数。您可以从事件处理程序和其他表单调用此函数。将访问修饰符更改为pu

我想访问Form2中Form1的EventHandler

Form1事件处理程序是:-

 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-你应该