功能间(两个form)数据交互的编程方法

时间:2023-03-09 00:59:03
功能间(两个form)数据交互的编程方法

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

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

一、实现机制示意图

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

1,异步调用

功能间(两个form)数据交互的编程方法

2,  同步调用

功能间(两个form)数据交互的编程方法

二、编程

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,在异步方式下返回信息时,也会传回来,通过它,将回应消息与发送信息进行匹配。