我有一些代码(C#WINFORM)
private void myGrid_CellClick(object sender, DataGridViewCellEventArgs e)
{
// How to find out?
}
我还在Form_Load上调用该事件:
myGrid_CellClick(dgvDropsToVal, new DataGridViewCellEventArgs(0, 0));
如何找出真正的鼠标点击或从myGrid_CellClick中的Form_Load触发?
其他然后在Form_Load上的bool标志。
答案 0 :(得分:2)
添加辅助方法:
private void myForm_Load(object sender, EventArgs e)
{
DoSomething(false);
}
private void myGrid_CellClick(object sender, DataGridViewCellEventArgs e)
{
DoSomething(true);
}
private void DoSomething(bool wasClicked)
{
}
答案 1 :(得分:0)
为什么要手动调用事件处理程序方法?它会让其他程序员感到困惑。创建单独的方法并使意图清晰。将代码保存在我的身上并不是代码的唯一消费者。
private void myGrid_CellClick(object sender, DataGridViewCellEventArgs e)
{
CellClickAction(parameter);
}
private void CellClickAction(Whatever parameter)
{
//Do whatever
}
在表单加载中,您可以调用相同的方法。
private void form_Load(object sender, EventArgs e)
{
CellClickAction(parameter);//parameter will say the source of method call
}
现在,您可以修改Whatever
参数以区分方法调用的来源。这使代码清晰。
答案 2 :(得分:0)
我会使用带有标志的辅助方法,因为这不会增加开销。如果您坚持编程错误,那么您可以查看StackFrame
或使用CallerMemberNameAttribute
。
请参阅:How do I get the calling method name and type using reflection?
private void myForm_Load(object sender, EventArgs e)
{
DoSomething();
}
private void myGrid_CellClick(object sender, DataGridViewCellEventArgs e)
{
DoSomething();
}
private void DoSomething([CallerMemberName] string caller = "")
{
// caller will contain "myForm_Load" or "myGrid_CellClick"
}
你将受到反射开销的惩罚。
答案 3 :(得分:0)
使用发送者参数怎么样?
private void myForm_Load(object sender, EventArgs e)
{
myGrid_CellClick(null, null);
}
private void myGrid_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (sender == null)
{
//called yourself in Form_Load
}
else
{
//called by control
}
}