none
事件委托的灵活运用,真不会,求指教 RRS feed

  • 问题

  • 现在有这么个情况:

    1. 我有一个Batch类,有个Id(Guid类型)属性,Name属性

    2. 另外一个类是BatchOperation类,有方法AddBatch用于添加Batch,DeleteBatch用于删除Batch以及UpdateBatch等方法。BatchOperation类引用了Batch类

    现在有一个功能按F2对Batch进行重命名操作,但是有个地方必须在Batch类里进行重命名(你也别问我为什么会在Batch里),而重命名操作呢要检查是否这个名字已经存在了,于是在BatchOperation类里有一个Dictionary<Guid,string>字典,key为batch的id,value为Name。每次在添加、删除、更新Batch的操作中都相应修改这个字典。但是在Batch类里进行重命名操作时,我需要获取这个字典以便判断是否新的名称已经存在了?我应该怎么在Batch拿到这个字典呢?

    听说通过委托或者事件也许能做到,我真想破脑子了还是没明白,因为本人对自定义事件和委托使用不是很熟练,望各位大侠不吝赐教,非常感谢,能否提供一个我这个功能的Demo,真的很感谢!!!!

    明天周一了要交差,实在没办法了,心里急了。。。。。


    程序人生

    2013年5月26日 14:33

答案

  • 首先还是中肯劝慰你把和Batch相关的业务逻辑全部移动到BatchOperator进行调用。

    如果你坚持要把一部分代码弄到Batch里边来,那么你可以尝试参考这个代码:

    namespace CSharp
    {
        public class UpdateEventArgs:EventArgs
        {
            /// <summary>
            /// 原先的名字
            /// </summary>
            public string OriginalName { getset; }
            public bool IsChanged { getset; }
        }
     
        public class Base
        {
            private string _name=null;
            public event EventHandler<UpdateEventArgs> RaiseBaseCheck = null;
     
            public string Name
            {
                get
                {
                    return _name;
                }
                set
                {
                    if (value != _name)
                    {
                        UpdateEventArgs eventArg = new UpdateEventArgs { OriginalName = _name,IsChanged=false };
                        //引发事件
                        RaiseBaseCheck(thiseventArg);
                        if (eventArg.IsChanged)
                        {
                            _name = value;
                        }
                    }
                }
            }
        }
     
        /// <summary>
        /// 写入Operator类中
        /// </summary>
        class Program
        {
            static void Main(string[] args)
            {
                Base b = new Base { Name = "A" };
                b.RaiseBaseCheck += b_RaiseBaseCheck;
            }
     
            static void b_RaiseBaseCheck(object senderUpdateEventArgs e)
            {
                //if (e.OriginalName)   //检查是否在Dictionary中
                //{
    
    e.IsChanged=true;             //}         }     } }

    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats


    Found any spamming-senders? Please report at: Spam Report

    2013年5月27日 2:59
    版主
  • hello,

    请参考标以下准事件写法
    http://www.dotblogs.com.tw/yc421206/archive/2012/08/12/73987.aspx

    事件写法是用在非同步EAP模组,请参考以下
    http://www.dotblogs.com.tw/yc421206/archive/2012/10/25/78910.aspx


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/


    2013年5月29日 8:53

全部回复

  • 首先还是中肯劝慰你把和Batch相关的业务逻辑全部移动到BatchOperator进行调用。

    如果你坚持要把一部分代码弄到Batch里边来,那么你可以尝试参考这个代码:

    namespace CSharp
    {
        public class UpdateEventArgs:EventArgs
        {
            /// <summary>
            /// 原先的名字
            /// </summary>
            public string OriginalName { getset; }
            public bool IsChanged { getset; }
        }
     
        public class Base
        {
            private string _name=null;
            public event EventHandler<UpdateEventArgs> RaiseBaseCheck = null;
     
            public string Name
            {
                get
                {
                    return _name;
                }
                set
                {
                    if (value != _name)
                    {
                        UpdateEventArgs eventArg = new UpdateEventArgs { OriginalName = _name,IsChanged=false };
                        //引发事件
                        RaiseBaseCheck(thiseventArg);
                        if (eventArg.IsChanged)
                        {
                            _name = value;
                        }
                    }
                }
            }
        }
     
        /// <summary>
        /// 写入Operator类中
        /// </summary>
        class Program
        {
            static void Main(string[] args)
            {
                Base b = new Base { Name = "A" };
                b.RaiseBaseCheck += b_RaiseBaseCheck;
            }
     
            static void b_RaiseBaseCheck(object senderUpdateEventArgs e)
            {
                //if (e.OriginalName)   //检查是否在Dictionary中
                //{
    
    e.IsChanged=true;             //}         }     } }

    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats


    Found any spamming-senders? Please report at: Spam Report

    2013年5月27日 2:59
    版主
  • hello,

    请参考标以下准事件写法
    http://www.dotblogs.com.tw/yc421206/archive/2012/08/12/73987.aspx

    事件写法是用在非同步EAP模组,请参考以下
    http://www.dotblogs.com.tw/yc421206/archive/2012/10/25/78910.aspx


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/


    2013年5月29日 8:53