首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

请教怎么判断一个TextBox已经存在TextChanged事件处理函数

2013-09-07 
请问如何判断一个TextBox已经存在TextChanged事件处理函数?添加TextChanged事件处理函数:this.textBox1.Te

请问如何判断一个TextBox已经存在TextChanged事件处理函数?
添加TextChanged事件处理函数:this.textBox1.TextChanged += this.textBox1_TextChanged;
删除TextChanged处理函数:this.textBox1.TextChanged -= this.textBox1_TextChanged;

但有没简单的办法判断textBox1已经存在TextChanged 处理函数?以及如何判断已经存在指定的textBox1_TextChanged?


[解决办法]
从事件设计的角度,你不应该关心TextChanged事件有多少个订阅(或者说你不拥有那些订阅)。
你只应该关心由你自己添加的处理函数。
[解决办法]
添加事件处理函数的时候先-=,再+=,就不会重复添加
[解决办法]


public bool HasTextChangedEvent(Control ctl, string eventName)
{
    PropertyInfo propertyInfo = ctl.GetType().GetProperty("Events", BindingFlags.NonPublic 
[解决办法]
 BindingFlags.Instance);
    EventHandlerList events = propertyInfo.GetValue(ctl, null) as EventHandlerList;
    FieldInfo fieldInfo = (typeof(Control)).GetField("EventText", BindingFlags.NonPublic 
[解决办法]
 BindingFlags.Static);
    Delegate del = events[fieldInfo.GetValue(null)];
    if (del == null) return false;
    foreach (Delegate d in del.GetInvocationList())
    {
         if (d.Method.Name == eventName)
             return true;
     }
     return false;
}


MessageBox.Show(HasTextChangedEvent(textBox1, "textBox1_TextChanged").ToString());

[解决办法]
引用:

public bool HasTextChangedEvent(Control ctl, string eventName)


{
    PropertyInfo propertyInfo = ctl.GetType().GetProperty("Events", BindingFlags.NonPublic 
[解决办法]
 BindingFlags.Instance);
    EventHandlerList events = propertyInfo.GetValue(ctl, null) as EventHandlerList;
    FieldInfo fieldInfo = (typeof(Control)).GetField("EventText", BindingFlags.NonPublic 
[解决办法]
 BindingFlags.Static);
    Delegate del = events[fieldInfo.GetValue(null)];
    if (del == null) return false;
    foreach (Delegate d in del.GetInvocationList())
    {
         if (d.Method.Name == eventName)
             return true;
     }
     return false;
}



MessageBox.Show(HasTextChangedEvent(textBox1, "textBox1_TextChanged").ToString());


这是正解。不过1L说的对,你不应该去关系别的调用者添加的事件。这也是为什么没有一个简便的方法可以获取事件的处理函数列表的原因。
[解决办法]
比较直观的办法:添加一个布尔变量has记录是否已经加入;在加入之前做判断,如果has不等于true才加入
if(!has){
 txt.TextChanged += clmFXL_TextChanged;
 has=true;
}
[解决办法]
txt.TextChanged -= clmFXL_TextChanged;
 txt.TextChanged += clmFXL_TextChanged;
直接搞定,没必要去考虑

热点排行