您的位置:首页 > 其它

委托之winForm窗口间传递数据

2010-02-24 09:03 330 查看
在winForm应用程序中,窗口间数据的传递是最多的应用之一,尤其是在管理软件当中。

窗口的数据传递,有多种方式,在这篇随笔中主要是阐述一下利用委托如何来传递数据。

在本实例程序中,有两个窗体:一个主窗体FrmMain,接收数据;一个子窗体FrmChild,传出数据,UI如下:







在主窗体中,[设置]按钮,弹出子窗体,在文本框中输入相应的值后,点击[确认]返回到主窗体,同时返回数据至主窗体。

具体代码实现如下:

[b]一、定义事件类:[/b]
publicclassPassDataWinFormEventArgs:EventArgs
{

publicPassDataWinFormEventArgs()
{
//
}
publicPassDataWinFormEventArgs(stringrefName,stringrefPlace,intrefAge)
{
this._name=refName;
this._place=refPlace;
this._age=refAge;
}

privatestring_name;
privatestring_place;
privateint_age;

publicstringName
{
get{return_name;}
set{_name=value;}
}
publicstringPlace
{
get{return_place;}
set{_place=value;}
}
publicintAge
{
get{return_age;}
set{_age=value;}
}
}
通过PassDataWinFormEventArgs的实例,传递数据。

[b]二、在子窗体中设计如下代码:[/b]
//添加一个委托
publicdelegatevoidPassDataBetweenFormHandler(objectsender,PassDataWinFormEventArgse);
//添加一个PassDataBetweenFormHandler类型的事件
publiceventPassDataBetweenFormHandlerPassDataBetweenForm;
书写子窗体确认按钮的代码如下:
privatevoidbbtOK_Click(objectsender,EventArgse)
{
stringname,place;
intage;

name=txtName.Text;
place=txtPlace.Text;

Int32.TryParse(txtAge.Text,outage);

PassDataWinFormEventArgsargs=newPassDataWinFormEventArgs(name,place,age);

PassDataBetweenForm(this,args);

this.Dispose();
}

[b]三、设计主窗体代码:[/b]
主窗体中[设置]按钮的代码如下:

privatevoidbbtSetup_Click(objectsender,EventArgse)
{
FrmChildfrmChild=newFrmChild();
frmChild.PassDataBetweenForm+=newFrmChild.PassDataBetweenFormHandler(FrmChild_PassDataBetweenForm);
frmChild.Show();
frmChild.Activate();
}

主要用来打开子窗体,绑定事件。

在FrmChild_PassDataBetweenForm()方法中接收PassDataWinFormEventArgs实例传递回来的数据,故此FrmChild_PassDataBetweenForm()代码如下:

privatevoidFrmChild_PassDataBetweenForm(objectsender,PassDataWinFormEventArgse)
{
this.txtName.Text=e.Name;
this.txtPlace.Text=e.Place;
this.txtAge.Text=e.Age.ToString();
}

[b]四、后记:[/b]
利用委托进行数据传递,有一个很大的优点就是,可以在任何窗体中调用子窗体,而不用修改子窗体内部的设计,从而达到高度复用子窗体。


0
0
0
(请您对文章做出评价)

«上一篇:委托之异步
»下一篇:Javascript获取CheckBoxList的value

try{
GS_googleAddAdSenseService("ca-pub-4210569241504288");
GS_googleEnableAllServices();
}
catch(e){}

try{
GA_googleAddSlot("ca-pub-4210569241504288","cnblogs_blogpost_body");
GA_googleAddSlot("ca-pub-4210569241504288","cnblogs_commentbox_up");
GA_googleAddSlot("ca-pub-4210569241504288","cnblogs_blogpost_bottom");
GA_googleAddSlot("ca-pub-4210569241504288","cnblogs_blogpost_bottom1");
}
catch(e){}

try{
GA_googleFetchAds();
}catch(e){}

varblog_ad_has_shown=false;

postedon2009-10-2423:19inforasc阅读(345)评论(9)编辑收藏网摘所属分类:C#基础知识


评论

1740010

#1楼2009-10-2522:05WinForm初学者[未注册用户]
在子窗体中顶一个public的PassDataWinFormEventArgs,主窗体直接获取,这种方式有什么缺点呐?
回复引用

#2楼2009-10-2522:17netKing
调试走到这一步时,报错
PassDataBetweenForm(this,args);
错误是:未将对象引用设置到对象的实例。
回复引用查看

#3楼2009-10-2609:31邢少
什么意思?..你是要说明委托的一种应用方式吗?还是要说委托可以用来传递参数。
还是说它是一个回调函数。
回复引用查看

#4楼[楼主]2009-10-2620:33inforasc
@邢少
应该是委托的一种应用吧!

在winform之间传递数据的时候,曾经尝试过其他方法,比如用Owner属性,总是感觉耦合性较高!
回复引用查看

#5楼[楼主]2009-10-2620:36inforasc
@netKing

代码应该是没问题的,我是从Vs.Net源码里面直接黏贴出来的。

可以告诉我具体是哪一个对象未实例化么?

回复引用查看

#6楼2009-10-2708:39邢少
@inforasc
嗯。推荐。记得以前有一次有人问了我一个问题。问:有a界面,界面上有一个按钮,弹出b页面,实现b控制a页面的图片变化?有几种方式?最少3种
回复引用查看

#7楼2009-10-2723:35ibate86
谢谢楼主,虽然不知道是不是新的思路,但却是第一次听说。多谢~
回复引用查看

#8楼[楼主]2009-10-2801:37inforasc
@ibate86
不是新思路,是实际项目中使用的,而且在一些技术文章上也看到过,好像在CodeProject上
回复引用查看

#9楼2010-01-0413:43StephenJu

viewsource

print?

01
private
void
bbtOK_Click(
object
sender,EventArgse)
02
{
string
name,place;
03
int
age;
04
name=txtName.Text;
05
place=txtPlace.Text;
06
Int32.TryParse(txtAge.Text,
out
age);
07
if
(PassDataBetweenForm!=
null
)
08
{
09
PassDataWinFormEventArgsargs=
new
PassDataWinFormEventArgs(name,place,age);PassDataBetweenForm(
this
,args);
10
this
.Dispose();
11
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: