不错呦!smile@林凯西,确保“准备文件”中的几个文件都有安装,S...您好,看了您这篇帖子觉得很有帮助。但是有个问题想请...我的修改过了怎么还被恶意注册呢 @jjjjiiii 用PJ快9年了,主要是A...PJ3啊,貌似很少有人用PJ了,现在不是WP就是z...@332347365,我当时接入时错误码没有-10...楼主,ChkValue值应为-103是什么意思呢?...大哥 你最近能看到我发的信息,请跟我联系,我有个制...
C#事件防止重复注册和移除全部事件示例
编辑:dnawo 日期:2015-01-05
复制内容到剪贴板
程序代码

public class WebBrowserEventManager
{
private EventHandlerList _ehList = new EventHandlerList();
private WebBrowser _wb = null;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="webbrowser"></param>
public WebBrowserEventManager(WebBrowser webbrowser)
{
_wb = webbrowser;
}
/// <summary>
/// 注册事件(不可重复注册)
/// </summary>
/// <param name="eventHandler"></param>
public void AddDocumentCompletedEvent(WebBrowserDocumentCompletedEventHandler eventHandler)
{
RemoveDocumentCompletedEvent(eventHandler);
_wb.DocumentCompleted += eventHandler;
_ehList.AddHandler(_wb.Name, eventHandler);
}
/// <summary>
/// 注册事件(移除全部事件再注册)
/// </summary>
/// <param name="eventHandler"></param>
public void AddDocumentCompletedEventEx(WebBrowserDocumentCompletedEventHandler eventHandler)
{
RemoveAllDocumentCompletedEvent();
_wb.DocumentCompleted += eventHandler;
_ehList.AddHandler(_wb.Name, eventHandler);
}
/// <summary>
/// 移除事件
/// </summary>
/// <param name="eventHandler"></param>
public void RemoveDocumentCompletedEvent(WebBrowserDocumentCompletedEventHandler eventHandler)
{
Delegate dg = _ehList[_wb.Name];
if (dg != null)
{
Delegate[] ivList = dg.GetInvocationList();
if (ivList != null)
{
for (int i = ivList.Length - 1; i >= 0; i--)
{
if (eventHandler == null || (eventHandler != null && (ivList[i] as WebBrowserDocumentCompletedEventHandler) == eventHandler))
{
_wb.DocumentCompleted -= ivList[i] as WebBrowserDocumentCompletedEventHandler;
_ehList.RemoveHandler(_wb.Name, ivList[i]);
}
//return; //不退出循环移除重复注册事件
}
}
}
}
/// <summary>
/// 移除全部事件
/// </summary>
public void RemoveAllDocumentCompletedEvent()
{
RemoveDocumentCompletedEvent(null);
}
}
{
private EventHandlerList _ehList = new EventHandlerList();
private WebBrowser _wb = null;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="webbrowser"></param>
public WebBrowserEventManager(WebBrowser webbrowser)
{
_wb = webbrowser;
}
/// <summary>
/// 注册事件(不可重复注册)
/// </summary>
/// <param name="eventHandler"></param>
public void AddDocumentCompletedEvent(WebBrowserDocumentCompletedEventHandler eventHandler)
{
RemoveDocumentCompletedEvent(eventHandler);
_wb.DocumentCompleted += eventHandler;
_ehList.AddHandler(_wb.Name, eventHandler);
}
/// <summary>
/// 注册事件(移除全部事件再注册)
/// </summary>
/// <param name="eventHandler"></param>
public void AddDocumentCompletedEventEx(WebBrowserDocumentCompletedEventHandler eventHandler)
{
RemoveAllDocumentCompletedEvent();
_wb.DocumentCompleted += eventHandler;
_ehList.AddHandler(_wb.Name, eventHandler);
}
/// <summary>
/// 移除事件
/// </summary>
/// <param name="eventHandler"></param>
public void RemoveDocumentCompletedEvent(WebBrowserDocumentCompletedEventHandler eventHandler)
{
Delegate dg = _ehList[_wb.Name];
if (dg != null)
{
Delegate[] ivList = dg.GetInvocationList();
if (ivList != null)
{
for (int i = ivList.Length - 1; i >= 0; i--)
{
if (eventHandler == null || (eventHandler != null && (ivList[i] as WebBrowserDocumentCompletedEventHandler) == eventHandler))
{
_wb.DocumentCompleted -= ivList[i] as WebBrowserDocumentCompletedEventHandler;
_ehList.RemoveHandler(_wb.Name, ivList[i]);
}
//return; //不退出循环移除重复注册事件
}
}
}
}
/// <summary>
/// 移除全部事件
/// </summary>
public void RemoveAllDocumentCompletedEvent()
{
RemoveDocumentCompletedEvent(null);
}
}
调用示例:
复制内容到剪贴板
程序代码

using System;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
private WebBrowserEventManager manager;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
manager = new WebBrowserEventManager(webBrowser1);
}
private void button1_Click(object sender, EventArgs e)
{
manager.AddDocumentCompletedEventEx(Todo1);
webBrowser1.Navigate("http://www.baidu.com/");
}
private void button2_Click(object sender, EventArgs e)
{
manager.AddDocumentCompletedEventEx(Todo2);
webBrowser1.Navigate("http://www.google.com/");
}
private void Todo1(object sender, WebBrowserDocumentCompletedEventArgs e)
{
MessageBox.Show("打开了百度。");
//针对百度页面的操作
}
private void Todo2(object sender, WebBrowserDocumentCompletedEventArgs e)
{
MessageBox.Show("打开了谷歌。");
//针对谷歌页面的操作
}
}
}
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
private WebBrowserEventManager manager;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
manager = new WebBrowserEventManager(webBrowser1);
}
private void button1_Click(object sender, EventArgs e)
{
manager.AddDocumentCompletedEventEx(Todo1);
webBrowser1.Navigate("http://www.baidu.com/");
}
private void button2_Click(object sender, EventArgs e)
{
manager.AddDocumentCompletedEventEx(Todo2);
webBrowser1.Navigate("http://www.google.com/");
}
private void Todo1(object sender, WebBrowserDocumentCompletedEventArgs e)
{
MessageBox.Show("打开了百度。");
//针对百度页面的操作
}
private void Todo2(object sender, WebBrowserDocumentCompletedEventArgs e)
{
MessageBox.Show("打开了谷歌。");
//针对谷歌页面的操作
}
}
}
参考资料
[1].C#中删除任意控件任意事件的事件列表的实现:http://blog.csdn.net/softman11/article/details/5615267
评论: 0 | 引用: 0 | 查看次数: 6132
发表评论
请登录后再发表评论!