C# 如何从按钮单击调用Gridview单元格单击事件

C# 如何从按钮单击调用Gridview单元格单击事件,c#,.net,winforms,C#,.net,Winforms,我有一个按钮,我必须调用Gridview事件。任何人都可以帮助我如何实现此功能。我的代码在下面 你能做什么 DataGridViewTextBoxColumn col1 = new DataGridViewTextBoxColumn(); DataGridViewTextBoxColumn col2 = new DataGridViewTextBoxColumn(); DataGridViewTextBoxColumn col3 = new DataGridViewTextBoxColumn()

我有一个按钮,我必须调用Gridview事件。任何人都可以帮助我如何实现此功能。我的代码在下面 你能做什么

DataGridViewTextBoxColumn col1 = new DataGridViewTextBoxColumn();
DataGridViewTextBoxColumn col2 = new DataGridViewTextBoxColumn();
DataGridViewTextBoxColumn col3 = new DataGridViewTextBoxColumn();
col1.HeaderText = "Variance";
col2.HeaderText = "Tolerance";
col3.HeaderText = "Flags";

if (e.ColumnIndex == 5 || e.ColumnIndex == 6)
{
    double  ActualWeight;
    double TargetWeight;

    object val1 = dataGridView2.Rows[e.RowIndex].Cells[5].Value;
    object val2 = dataGridView2.Rows[e.RowIndex].Cells[6].Value;

    if (val1 != null && val2 != null
      && double.TryParse(val1.ToString(), out ActualWeight)
      && double.TryParse(val2.ToString(), out TargetWeight))
    {
        dataGridView2.Rows[e.RowIndex].Cells[0].Value =Math.Round (ActualWeight-TargetWeight);
    }
    else
    {
        dataGridView2.Rows[e.RowIndex].Cells[0].Value =         "Invalid Numbers";
    }       
}


protected void bUpdate_Click(object sender, EventArgs e)
{
   // I have to call Gridview Event here
}

你不能再引发其他类事件。事件实际上是作为私有委托编写的。但是您可以通过反射控制继承来实现

在控件继承中,必须首先从目标控件(DataGridView)继承,然后定义一个方法来调用运行它所需的事件

换句话说,您只需找到private delegate字段,获取它,然后调用它:

public static void Raise<TEventArgs>(this object source, string eventName, TEventArgs eventArgs) where TEventArgs : EventArgs
    {
        var eventDelegate = (MulticastDelegate)source.GetType().GetField(eventName, BindingFlags.Instance | BindingFlags.NonPublic).GetValue(source);
        if (eventDelegate != null)
        {
            foreach (var handler in eventDelegate.GetInvocationList())
            {
                handler.Method.Invoke(handler.Target, new object[] { source, eventArgs });
            }
        }
    }
publicstaticvoidraise(此对象源,字符串eventName,TEventArgs eventArgs),其中TEventArgs:eventArgs
{
var eventDelegate=(MulticastDelegate)source.GetType().GetField(eventName,BindingFlags.Instance | BindingFlags.NonPublic).GetValue(source);
if(eventDelegate!=null)
{
foreach(eventDelegate.GetInvocationList()中的变量处理程序)
{
调用(handler.Target,新对象[]{source,eventArgs});
}
}
}
参考资料:


例如,我通过名称创建了一个静态类MySharedClass

using System.Reflection;

namespace WindowsFormsApplication1
{
    public static class MySharedClass
    {
        public static void Raise<TEventArgs>(this object source, string eventName, TEventArgs eventArgs) where TEventArgs : EventArgs
        {
            var eventDelegate = (MulticastDelegate)source.GetType().GetField(eventName, BindingFlags.Instance | BindingFlags.NonPublic).GetValue(source);
            if (eventDelegate != null)
            {
                foreach (var handler in eventDelegate.GetInvocationList())
                {
                    handler.Method.Invoke(handler.Target, new object[] { source, eventArgs });
                }
            }
        }
    }
}

感谢@Behzad的指示,但我不确定如何实现您的IDEA调用控件事件首先在项目中定义一个静态类,然后在该类中编写Raise方法。因此,将参数传递给以下对象:source='your control(dataGridView)'、eventName='一个事件的名称'、eventArs='被调用事件的事件参数',例如==>public void simcard(){var args=new DataGridViewCellEventArgs(columnIndex;rowIndex);dataGridView2_CellContentClick(dataGridView2,args)你的意思是:public void simcard(){var args=new DataGridViewCellEventArgs(columnIndex;rowIndex);dataGridView2.Raise(“CellContentClick”,args);}是的,我这么做了,但它不接受参数,一直说未声明的项,这意味着我会有一些封装的变量,这些变量与mt grdview方法中的变量不同。
private void button1_Click(object sender, EventArgs e)
    {
        dataGridView1.Raise("Click", new EventArgs());
    }