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