相关疑难解决方法(0)

是否已添加事件处理程序?

有没有办法判断是否已将事件处理程序添加到对象中?我正在将对象列表序列化为进入/退出会话状态,因此我们可以使用基于SQL的会话状态...当列表中的对象更改了属性时,需要对其进行标记,事件处理程序在此之前正确处理.但是现在当对象被反序列化时,它没有得到事件处理程序.

在轻微的烦恼中,我刚刚将事件处理程序添加到访问该对象的Get属性中.它现在被调用,这很好,除了它被调用5次,所以我认为处理程序只是在每次访问对象时都会被添加.

它真的很安全,只是忽略,但我宁愿通过检查处理程序是否已被添加来使它更清洁,所以我只这样做了一次.

那可能吗?

编辑:我不一定完全控制添加什么事件处理程序,所以只检查null是不够的.

.net c# asp.net

173
推荐指数
6
解决办法
13万
查看次数

多次阻止相同的事件处理程序分配

如果我在运行时分配事件处理程序并且它位于可以多次调用的位置,那么建议的做法是防止同一处理程序多次分配给同一事件.

object.Event += MyFunction
Run Code Online (Sandbox Code Playgroud)

在一个将被多次调用的位置添加它将执行处理程序'n'次(当然).

在尝试添加via之前,我已经尝试删除任何先前的处理程序

object.Event -= MyFunction; 

object.Event += MyFunction;
Run Code Online (Sandbox Code Playgroud)

这可行,但似乎不知何故.有关正确处理的任何建议;)此方案.

c# events

45
推荐指数
1
解决办法
2万
查看次数

如何确保只订阅一次事件

我想确保我只在特定的类中为一个实例上的事件订阅一次.

例如,我希望能够做到以下几点:

if (*not already subscribed*)
{
    member.Event += new MemeberClass.Delegate(handler);
}
Run Code Online (Sandbox Code Playgroud)

我该如何实施这样的警卫?

c# events event-handling subscription

43
推荐指数
4
解决办法
2万
查看次数

哪种C#模式具有更好的性能以避免重复的事件处理程序?

避免重复注册事件处理程序基本上有两种模式:(根据此讨论:C#模式防止事件处理程序挂钩两次)

  1. 使用System.Linq命名空间,并通过调用检查事件处理程序是否已注册 GetInvocationList().Contains(MyEventHandlerMethod);

  2. 在注册之前取消注册,如下所示:

    MyEvent -= MyEventHandlerMethod;
    MyEvent += MyEventHandlerMethod;
    
    Run Code Online (Sandbox Code Playgroud)

我的问题是,性能方面,哪一个更好,或者它们在性能上有显着差异?

c# eventhandler

11
推荐指数
2
解决办法
1542
查看次数

区分用户交互和我自己的代码引发的事件

在以下情况SelectedIndexChanged下,从组合框中在我的应用程序中触发该事件:

  1. 用户在组合框中选择不同的项目,或者在以下情况下:
  2. 我自己的代码更新了组合框,SelectedItem以反映组合框现在显示不同对象的属性.

SelectedIndexChanged对案例1 的事件感兴趣,以便我可以更新当前对象的属性.但在案例2中,我不希望事件触发,因为对象的属性没有改变.

一个例子可能有帮助.让我们考虑一下,我有一个包含人员列表的列表框,我有一个组合框,表示列表中当前所选人员的国籍.如果当前在列表中选择了Fred,则可能发生情况1,并且我使用组合框将他的国籍从英语更改为威尔士语.如果我在列表中选择苏格兰人Bob,则可能发生案例2.在这里,我的列表更新事件处理程序代码看到Bob现在被选中,并更新组合框,以便苏格兰语现在是所选项目.这导致组合框的SelectedIndexChanged事件被触发以将Bob的国籍设置为苏格兰语,尽管它已经是苏格兰人.

如何在SelectedItem不导致SelectedIndexChanged事件触发的情况下更新我的组合框的属性?一种方法是取消注册事件处理程序,设置SelectedItem,然后重新注册事件处理程序,但这似乎很乏味且容易出错.肯定有更好的办法.

c# events combobox winforms

9
推荐指数
1
解决办法
3688
查看次数