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

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

一、实现机制示意图

两种调用方式:同步和异步。以下是两种调用的示意图。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,在异步方式下返回信息时,也会传回来,通过它,将回应消息与发送信息进行匹配。

功能间(两个form)数据交互的编程方法的更多相关文章

  1. android实现两个activity数据交互

    android如何实现两个Activity数据交互?主要是根据Intent的携带功能,intent可以携带很多信息,比如Bundle,URI甚至对象(此时要序列化,并且对象里面的成员变量如果是对象,也 ...

  2. vue仓库、组件间通信、前后台数据交互、前端储存数据大汇总

    目录 路由重定向 仓库介绍 vuex插件:可以完成任意组件间信息交互(移动端) 前端存储数据大汇总 前后台交互方式(重点) 前后台数据交互 axios插件:完成前后台ajax交互的 同源策略 - 前后 ...

  3. 前后端数据交互(八)——请求方法 GET 和 POST 区别

    WEB 开发同学一看 get 和 post 请求方法的区别,第一感觉都是 So easy! 学习ajax.fetch.axios时,发送网络请求携带参数时,都需要分别处理get和post的参数.所以我 ...

  4. ASP.NET - 自定义控件处理页面事件(控件与页面数据交互)的方法

    //用委托的方法实现 //控件代码 public delegate void DelegateFunction( string sPageTitle ); private DelegateFuncti ...

  5. 如何安全的在不同工程间安全地迁移asset数据?三种方法

    答:1.将Assets和Library一起迁移2.导出包package3.用unity自带的assets Server功能

  6. Android进阶之Fragment与Activity之间的数据交互

    1 为什么 因为Fragment和Activity一样是具有生命周期,不是一般的bean通过构造函数传值,会造成异常. 2 Activity把值传递给Fragment 2.1 第一种方式,也是最常用的 ...

  7. 用C++实现网络编程---抓取网络数据包的实现方法

    一般都熟悉sniffer这个工具,它可以捕捉流经本地网卡的所有数据包.抓取网络数据包进行分析有很多用处,如分析网络是否有网络病毒等异常数据,通信协议的分析(数据链路层协议.IP.UDP.TCP.甚至各 ...

  8. Windows窗体间的数据交互

    轻松掌握Windows窗体间的数据交互                                     作者:郑佐 2004-04-05 Windows 窗体是用于 Microsoft Win ...

  9. 两种方法实现asp.net方案的前后端数据交互(aspx文件、html+ashx+ajax)

    一个HTML页面只能显示HTML代码信息,不能与数据库进行数据的交互.asp.net方案提供了网页与数据库交互的方法,这里举出两种:①aspx文件 ②ashx文件+ajax技术 一.创建数据库 这里以 ...

随机推荐

  1. http://blog.csdn.net/baimafujinji/article/details/10931621

    书接上文,本文章是该系列的第二篇,按照总纲中给出的框架,本节介绍三个中值定理,包括它们的证明及几何意义.这三个中值定理是高等数学中非常基础的部分,如果读者对于高数的内容已经非常了解,大可跳过此部分.当 ...

  2. Oracle PL/SQL 游标

    在PL/SQL块中执行SELECT.INSERT.DELETE和UPDATE语句时,ORACLE会在内存中为其分配上下文区(Context Area),即缓冲区.游标是指向该区的一个指针,或是命名一个 ...

  3. 使用数据库绑定ListBox控件

    1. The HTML Markup <div> <asp:ListBox ID="ListBox1" runat="server">& ...

  4. jz2440不能成功地启动文件系统, Failed to execute /linuxrc.

    文件系统加载失败,错误信息提示:    VFS: Mounted root (nfs filesystem).    Freeing init memory: 140K    Failed to ex ...

  5. 关于PagedDataSource分页属性与DataSet和DataTable详解

    Asp.net提供了三个功能强大的列表控件:DataGrid.DataList和Repeater控件,但其中只有DataGrid控件提供分页功能.相对DataGrid,DataList和Repeate ...

  6. _int64、long long 的区别

    C++的64位整数[原]by 赤兔 http://baike.baidu.com/view/1235293.htm 在做ACM题时,经常都会遇到一些比较大的整数.而常用的内置整数类型常常显得太小了:其 ...

  7. [LeetCode]题解(python):027-Remove Element

    题目来源: https://leetcode.com/problems/remove-element/ 题意分析: 给定一个数组和一个数值val,将数组中数值等于val的数去除.不能申请额外空间,超过 ...

  8. poj 2480 Longge's problem

    /** 大意: 计算f(n) = ∑ gcd(i, N) 1<=i <=N. 思路: gcd(i,x*y) = gcd(i,x) * gcd(i, y ) 所以gcd 为积性函数 又因为积 ...

  9. C# Programming Study #1

    引用的时候需要在参数和使用的时候加上 ref 关键字 static bool addnum (ref int val) //引用 { ++val; return true; } 参数数组的概念,可以接 ...

  10. 这些屌炸天的创业者为何对投资人说NO

    曾有人说,世上的创业者只分为两种,一种是找到投资的,一种是没有找到的. 但其实还有第三种,就是那些拒绝了投资人的创业者. 他们摒弃了投资人抛来的橄榄枝,并非不差钱,不接受投资的原因大体出于两个方面,一 ...