我有一个Control,如DataGridView,并为此声明了几个事件。
例如: CellEndEdit,CellLeave,RowLeave,RowsAdded,SelectionChanged,....
现在,当我想在网格中插入多条记录时,每条记录都会执行SelectionChanged,而我不想调用SelectionChanged个事件! 这只是我在事件中遇到问题的一个例子。
总之,我的问题是,如何知道这个事件处理的原因是用户还是应用程序执行的方法呢? 换句话说,如何知道这个SelectionChanged事件是由用户运行的还是一个名为?
的方法答案 0 :(得分:0)
我不知道但是我通过创建一个方法来解决这个问题,该方法在控制中使我想要的东西(编辑单元格,留下单元格,留一行,添加一行,更改选择...在你的例)忽略事件处理程序。
例如,如果我有一个TextBox并且我想更新它而不听事件文本已更改,我会这样做:
textBox.TextChanged -= eventHandler;
textBox.Text = text;
textBox.TextChanged += eventHandler;
你可以用这样的方法封装它:
/// <summary>
/// Assigns text to textBox.Text ignoring the event handler eventHandler for the event TextChanged.
/// </summary>
/// <param name="textBox">Text box control.</param>
/// <param name="eventHandler">Event handler to ignore.</param>
/// <param name="text">Text to assign.</param>
public static void AssignSilently(TextBox textBox, EventHandler eventHandler, string text)
{
textBox.TextChanged -= eventHandler;
textBox.Text = text;
textBox.TextChanged += eventHandler;
}
答案 1 :(得分:0)
我认为这个答案是正确的:
public void JustCallEventByUser<TEventArgs>(Action<object, TEventArgs> method, object sender, TEventArgs e) where TEventArgs : EventArgs
{
var frames = new System.Diagnostics.StackTrace().GetFrames();
if (frames == null) return;
//
// This method (frames[0]= 'JustCallEventByUser') and declaration listener method (frames[1]= '(s, e)=>') must be removed from stack frames
if (!frames.Skip(2).Any(x =>
{
Type declaringType = x.GetMethod().DeclaringType;
return declaringType != null && declaringType.Name == this.Name;
}))
{ method.Invoke(sender, e); }
}
我创建了一个在侦听器和事件之间播放界面角色的方法。在那里,我检查StackTrace,知道谁叫我跑一个听众!
例如用法:
gridViewMain.SelectionChanged += (s, e) =>
JustCallEventByUser(gridViewMain_SelectionChanged, s, e);
请表达您的意见!感谢