【问题标题】:C# Deleting a Event Handler while program is in use [duplicate]C#在程序正在使用时删除事件处理程序[重复]
【发布时间】:2021-09-15 03:09:02
【问题描述】:

有没有办法在程序运行时删除事件处理程序?

textBox1.TextChanged += (s, a) =>
            {
                JRPC.SetMemory(rgh, 0xc035261d, reverseBytes(textBox1.Text));
                JRPC.SetMemory(rgh, 0xc035261c, getBytes(Encoding.ASCII.GetBytes(textBox1.Text + "\0")));
            };

我有上面的代码可以在 Xbox 上实时编辑玩家的 Gamertag。当它选中一个复选框时,它将发现事件处理程序。但是当我取消选中它时,我需要它来删除这个事件处理程序,我想我会这样做(见下文)

textBox1.TextChanged += (s, a) =>
            {

            };

但我想知道是否有适当的方法将事件处理程序全部删除,而不是让打开的处理程序什么都不做。

【问题讨论】:

  • 嗯... += 只是添加另一个处理程序(可以有很多)。你最好制作一个实际的方法,你可以很容易地 -= 当你完成它时。

标签: c#


【解决方案1】:

您可以清除类中事件表单的调用列表,但在您的情况下,您只能从中取消订阅事件处理程序。

由于您使用的是匿名方法,因此您也不能这样做,您需要在某处保留该方法的引用,稍后您可以使用-= 运算符将其从调用列表中删除。

您可以像这样将匿名方法提取为命名方法:

private void MyMethod(object sender, EventArgs args)
{
    JRPC.SetMemory(rgh, 0xc035261d, reverseBytes(textBox1.Text));
    JRPC.SetMemory(rgh, 0xc035261c, getBytes(Encoding.ASCII.GetBytes(textBox1.Text + "\0")));
}

然后你会像这样订阅事件:

textBox1.TextChanged += MyMethod;

如果你想移除它并且在事件被调用时不再调用它:

textBox1.TextChanged -= MyMethod;

【讨论】:

  • 你能解释一下如何做吗?我一直在环顾四周,发现了一些东西,但我很困惑如何删除它。
  • @areed99 添加了如何做到这一点的示例。
  • 工作得很好,谢谢你,感谢你的例子,我更好地理解我做错了什么,我很感激!
猜你喜欢
  • 1970-01-01
  • 2011-09-21
  • 1970-01-01
  • 2010-11-24
  • 2010-11-21
  • 2010-11-14
  • 1970-01-01
  • 2016-07-05
  • 2012-05-10
相关资源
最近更新 更多