如何了解由用户或应用程序方法处理的事件

本文关键字:应用程序 方法 处理 事件 用户 何了解 了解 | 更新日期: 2023-09-27 17:50:11

我有一个像DataGridView这样的控件,并为它声明了几个事件。

例如

:cellenddit, CellLeave, RowLeave, RowsAdded, SelectionChanged, ... .

现在,当我想要插入几条记录到网格,也有SelectionChanged为每一个他们被执行,而我不想调用SelectionChanged事件!这只是我在事件中遇到问题的一个例子。

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

如何了解由用户或应用程序方法处理的事件

我不知道,但我解决了这样的问题,通过创建一个方法,使在控制我想要的(编辑一个单元格,离开一个单元格,离开一行,添加一行,改变选择…在您的示例中)忽略事件处理程序。

例如,如果我有一个文本框,我想更新它而不听事件文本的变化,我做这样的事情:

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

我认为这个答案是正确的:

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

请发表你的意见!由于