zoukankan      html  css  js  c++  java
  • c#委托事件 自己理解

    都说C#的委托与事件,对初学者来说很难,但是一跃过去就很简单了

    单是我这个一跃不知道还要多久,为什么对有些人来说简单的事,我却那么难,好吧,这个是必须掌握的

    需求:发卡器,我要去程序中调用发卡器的方法,得到卡的卡号信息

    常人理解:很简单,卡一方,点下读取的事件就可以了

    我:想把它做成公用的DLL,使用事件注册来实现读取卡号

    1.新建类库 ReaderTest--》类Reader

     public Reader(){}-->构造函数(里面又写了连接发卡器的方法)

    2.定义委托

     public delegate void ReaderEventHandler(CardInfo card);

    3.定义事件

    public event ReaderEventHandler ReaderEvent;

    4.事件触发方法 

    protected virtual void ReaderCard(CardInfo card)

    {   //防止可能存在的多线程同步问题。

         ReaderCardHandler tmpEvent = ReaderCardEvent;
         if (tmpEvent != null)
         {
             tmpEvent(e);
          }
    }
    5.信息类
    public class CardInfo
    {
       //a,b属性略
       public CardInfo(string a,string b)
      {
         赋值略
       }
    }

    6.对外的方法界面类调用方法 实现事件数据传输通道口

    public void GetCardInfo()

    {

    //逻辑方法处理处

               ulong CardNo;
                int CardType;
                int nRet = Card_ReadCardNo(&CardNo, &CardType);
                if (nRet == 0)
                {
                    string cardno = CardNo.ToString("x8");
                    string cardtype = CardType.ToString();
                    CARDINFO card = new CARDINFO(cardno,cardtype);
                    //传递事件方法
                    ReadCard(card);
                }
                else
                {
                    Console.WriteLine("无法连接一卡通");
                }

    }

    7。生成dll

    8.界面类使用(添加完引用)

    先实例化类

    在LOAD里注册事件

      Reader.ReaderCardEvent += new XZX.ReaderSU.ReaderCard.ReaderCardHandler(ReadCard);

    //ReadCard方法实现 与内部委托参数一致

    private void ReadCard(XZX.ReaderSU.ReaderCard.CARDINFO e)
            {
                string cardno = e.CardNo;
                string cardtype = e.CardType;
               //更新界面元素
                this.Invoke(new Action(() =>
                {
                    lblCardNo.Text = cardno;
                    lblType.Text = cardtype;
                    lblTime.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                }));
               
            }
  • 相关阅读:
    vs2008及以上的ActiveX测试容器在哪儿
    关于databinding的细节
    C#使用StackTrace获取方法被谁调用
    你是怎么走神的?
    怎样让SoapHttpClientProtocol不使用系统默认代理
    List的FindIndex和ForEach
    List的Capacity
    装箱和拆箱
    FileSystem.DeleteDirectory遇到"无法删除 文件:无法读取源文件或磁盘"
    一段关于测试和自定义Attribute的代码
  • 原文地址:https://www.cnblogs.com/Gracedream/p/5139951.html
Copyright © 2011-2022 走看看