zoukankan      html  css  js  c++  java
  • 功能间(两个form)数据交互的编程方法

    功能间数据交互的编程方法

     现在框架具有在两个打开的功能之间进行通讯的机制。通讯是指,一个功能调用另外一个功能的方法,或者传递一些数据,并得到返回结果。比如处置单打开结算单,结算单保存后,将结算单号反填到处置单上去。该机制通过委托实现两个功能之间方法的调用来通讯,支持同步和异步两种方式。框架隐藏了委托以及委托异步调用实现的复杂度。

    一、实现机制示意图

    两种调用方式:同步和异步。以下是两种调用的示意图。A为调用方,B为被调用方。也就是A功能调用B功能。

    1,异步调用

                 

    2,  同步调用

                 

    二、编程

    1,接收方(功能A),数据接收方,如处置单窗口

    (1)        实现消息管道方法

    从实现上讲,消息管道是接收方或者发送方类的一个方法。

    消息管道方法实现数据的接收,包括

    -          发送方主动发送过来的数据,或者

    -          接收方对自己发送数据的处理结果的反馈数据。(异步模式下)

    在消息管道方法里,对接收发送方发送过来的数据,进行处理,并返回处理结果。

    管道方法的声明:

    Object 方法名称( object sender, string messageId, object message )

    Sender:一般是发送方的窗口对象。

    messageId:消息唯一标识。正常发送的数据,消息标识为null。如果是接收方返回的数据,则是发送时的消息标识。发送方可以根据该消息标识做特定的处理。

    message:发送过来的数据。

    (2)        注册消息管道方法到EAFC

    注册消息管道,返回管道ID:

    Xsoft.UI.MessageChannelDelegete     revDelegate = null;   

    revDelegate = new     MessageChannelDelegete(this.MessageChannel);

    string myChannelID     = Xsoft.UI.EafcApp.RegistMessageChannelDelegate(revDelegate,  this);   

     注册myChannelID要传给功能B,在打开功能B的时候要用到。

    注意:在窗口退出的时候,要记得取消注册:

    Xsoft.UI.EafcApp.UnregistMessageChannelDelegate(myChannelID )

    (3)        打开数据发送方(功能B)

    Xsoft.UI.FunctionMgr.FunctionCall("9981", null, this.Handle, FormOpenMode.RESPONSE, myChannelID);

    注意:如果用FormOpenMode.RESPONSE(对话框)打开的话,被打开的功能依然显示在一个标签页中,但是只有被打开的功能(9981功能)关闭后,打开9981功能的窗口才可以关闭。并且使用这种打开方式时,一定要传当前窗口的句柄:this.Handle

    2,发送方(功能B),数据发送方,如结算单窗口

    (1)        注册消息管道方法到EAFC,并实现之。

    在异步调用模式下,管道方法也用来接收数据接收方返回的数据。

    注意:发送方的消息管道方法不是必须的,如果使用同步调用,或者虽然使用异步模式但不需要接收数据接收方的返回数据时,不需要注册管道方法。

    (2)        获得数据接收方的接收管道ID:RecChannelID。

    接收管道ID在发送时要使用。

    数据接收方的接收管道ID是由接收方在调用(打开)发送方时,传递给数据发送方的。

    在Load方法中:             

    XmlDocument doc = new XmlDocument();

    doc.LoadXml("<arg>"     + this.Tag.ToString() + "</arg>");

    XmlNode root = doc.DocumentElement;

    XmlNode arg = doc.DocumentElement.FirstChild;

    while (arg != null)

    {

       switch     (arg.Name)

       {

           case     "MessageReceiver":

               RecChannelID= arg.InnerXml;

               break;

           default:

              break;

       }

       arg = arg.NextSibling;

     }   

     (3)        发送数据到数据接收方:功能A

    同步发送

    this.textBox1.Text = EafcApp.TransferMessage(RecChannelID, this, this.textBox1.Text) as string;

    异步发送

    string msgId = Guid.NewGuid().ToString();

    EafcApp.AsyncTransferMessage(RecChannelID, myChannelID, this, msgId, data);

    MsgId数据发送时的消息ID,在异步方式下返回信息时,也会传回来,通过它,将回应消息与发送信息进行匹配。

  • 相关阅读:
    work two year[转]
    知名技术博客内容聚合网站
    VS2010注册码
    某公司的一个题面试题(wfcfan)
    asp.net控件开发基础系列
    .NET (C#) Internals: Delegates1
    可空类型细微见真知!
    C#中操作XML Node节点细节操作
    sql server数据库性能的优化
    字符串精确匹配算法改进的探讨
  • 原文地址:https://www.cnblogs.com/senline/p/4273189.html
Copyright © 2011-2022 走看看