如何知道用户或应用方法处理的事件?

时间:2015-05-21 10:51:10

标签: c# winforms events controls

我有一个Control,如DataGridView,并为此声明了几个事件。

例如: CellEndEditCellLeaveRowLeaveRowsAddedSelectionChanged,....

现在,当我想在网格中插入多条记录时,每条记录都会执行SelectionChanged,而我不想调用SelectionChanged个事件! 这只是我在事件中遇到问题的一个例子。

总之,我的问题是,如何知道这个事件处理的原因是用户还是应用程序执行的方法呢? 换句话说,如何知道这个SelectionChanged事件是由用户运行的还是一个名为?

的方法

2 个答案:

答案 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);

请表达您的意见!感谢