如何调用Gridview单元格单击事件来自按钮单击



我有一个按钮,我必须在上面调用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)继承,因此定义一个方法来调用您需要运行的事件。

换句话说,您只需要找到私有委托字段,获取它,然后调用它:

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 });
            }
        }
    }

参考文献:

以下代码示例显示如何加载程序集、从程序集中创建类型的实例、使用动态程序集创建事件处理程序以及挂接动态事件处理程序。所有操作都使用后期绑定执行。

如何:使用反射连接代理

如何在中通过反思来引发事件。NET/C#?

例如,我创建了一个名为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 });
                }
            }
        }
    }
}

然后,在视图层代码中,例如在按钮上单击事件引发:

private void button1_Click(object sender, EventArgs e)
    {
        dataGridView1.Raise("Click", new EventArgs());
    }

最新更新