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

如何控制一个委托事件里同样的方法只注册一次

2012-06-30 
怎么控制一个委托事件里同样的方法只注册一次大家好,请教大家一个问题。我有一个单例窗体如 Fax:Form 里面

怎么控制一个委托事件里同样的方法只注册一次
大家好,请教大家一个问题。我有一个单例窗体如 Fax:Form 里面定义了一个委托事件

C# code
public delegate void UpdateFaxEventHander(string tifPath);public event UpdateFaxEventHander UpdateFax;

此事件在另一个窗体的构造函数里被注册如:
C# code
        public FrmFaxTaskEdit()        {            InitializeComponent();                      Fax.Instance.UpdateFax += new Fax.UpdateFaxEventHander(Instance_UpdateFax);        }

在我每次实例化FrmFaxTaskEdit 时都会给Fax.Instance.UpdateFax 注册Instance_UpdateFax 这个方法。
想请教下大家 有什么判断条件可以控制 Instance_UpdateFax 只被UpdateFax这个事件注册一次。
注:不想在窗体的Closed事件中注销这个事件的方法,因为FrmFaxTaskEdit可能会被打开多个。这样也起不到作用。
请教啦!

[解决办法]
if(Fax.Instance.UpdateFax == null)
{
Fax.Instance.UpdateFax += new Fax.UpdateFaxEventHander(Instance_UpdateFax);
}
[解决办法]
用事件访问器。

在add和remove里面写自己的逻辑就行了。
[解决办法]
事件注册不放在构造函数中,定义一个方法来注册,这样你可以在代码中控制什么情况下注册

[解决办法]
OK,搞定了,代码如下:

Fax.Instance.UpdateFax += new Fax.UpdateFaxEventHander(Instance_UpdateFax);

if (!Fax.Instance.UpdateFax.GetInvocationList().Contains((UpdateFaxEventHander)Instance_UpdateFax))
{
UpdateFax += new UpdateFaxEventHander(Instance_UpdateFax);
}

-------------
解释一下,这个GetInvocationList()可以获取委托链,就是说你绑定了哪些函数要执行。 在这个委托链中判断下是否已经添加就可以了。
[解决办法]
探讨
Fax.Instance.UpdateFax += new Fax.UpdateFaxEventHander(Instance_UpdateFax);
改为:
if (!Fax.Instance.UpdateFax.GetInvocationList().Contains((Fax.UpdateFaxEventHander)Instance_UpdateFax))
{
Fax.Inst……

[解决办法]
这样就可以了:
C# code
                Delegate[] allDlg = new Delegate[this.UpdateFax.GetInvocationList().GetLength(0)];                this.UpdateFax.GetInvocationList().CopyTo(allDlg, 0);                foreach (Delegate dlg in allDlg)                {                    if (dlg.Method.Name == "Form1_UpdateFax")                    {                        //不在绑定                    }                    else                    {                        //绑定                        UpdateFax += new UpdateFaxEventHander(Form1_UpdateFax);                        MessageBox.Show("绑定成功");                    }                }
[解决办法]
探讨
引用:
Fax.Instance.UpdateFax += new Fax.UpdateFaxEventHander(Instance_UpdateFax);

if (!Fax.Instance.UpdateFax.GetInvocationList().Contains((Fax.UpdateFaxEventHander)Instance_UpdateFa……

[解决办法]
用单例模式 如下:
C# code
    class Program    {        static void Main(string[] args)        {            pokeer pk = pokeer.GetIntence();        }    }    class pokeer    {        private readonly static object pkLog = new object();        private static pokeer pk = null;        private pokeer()        {        }        public static pokeer GetIntence()        {            if (pk == null)            {                lock (pkLog)                {                    if (pk == null)                    {                        pk = new pokeer();                    }                }            }            return pk;        }    } 


[解决办法]

探讨

用单例模式 如下:
C# code

class Program
{
static void Main(string[] args)
{
pokeer pk = pokeer.GetIntence();


}

}

class pokeer
{


privat……

[解决办法]
探讨
在没有给UpdateFax注册方法之前 调用UpdateFax.GetInvocationList()是会出错的

[解决办法]
System.Delegate 成员

所有委托隐式继承自System.Delegate 你看看这个类中提供那些属性及方法。。

其中:

有意思的方法:
DynamicInvoke动态调用(后期绑定)由当前委托所表示的方法。 
GetInvocationList 返回委托的调用列表。
Remove 从一个委托的调用列表中移除另一个委托的最后一个调用列表。 
RemoveAll 从一个委托的调用列表中移除另一个委托的所有调用列表。 

属性:
Method 获取委托所表示的方法。 
Target 获取类实例,当前委托将对其调用实例方法。 


[解决办法]
何必呢,写个单件模式的类,专门负责绑定不就好了

热点排行