标题:[原创]两个窗体之间传递数据
只看楼主
月夜枫华
Rank: 4
等 级:贵宾
威 望:12
帖 子:437
专家分:42
注 册:2006-1-2
 问题点数:0 回复次数:46 
[原创]两个窗体之间传递数据

来论坛这么久了,在C#版也"混"了一年多,除了在提问时发起过帖子以外从来没说过什么技术性问题.
既然是第一次我就一定要把自己的话说出来,我从来都是使用自己的方法,可能不是最好的,但一定是解决问题的.
如果有比我更好的方法,请不要吝啬,我有哪里说错的,请指正!
下面说正题:
如题,我们经常需要在两个窗体间传递数据,我从前都是使用类的静态变量来进行传递.后来群里有人说我这是"严重违反了OOP思想",确实是这样,而且这个方法在多线程的程序中很不适用.
目前我们使用的比较多情况就是在某个新窗体出现时,需要传递一些参数,这里我通常是重载新窗体的构造函数
比如:
原构造函数:
public Form2()
{
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent();

//
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//
}
我们将这个方法复制粘贴一份以后修改新的构造方法,参数可以随意指定
public Form2(string parameter1,int parameter2)
{
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent();

//
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//
}
我们在调用时(假设主窗体是Form1)直接使用:Form2 form2=new Form2(str1,str2);
这样就可以把两个参数传递到Form2中了.如果是在多线程中,需要两个窗体同时操作的,还可以考虑使用公有变量,但要注意保护锁的问题.
再说说如果Form2中产生了一些数据,如何传递给Form1.
目前我认为比较好的方式是使用自定义事件.
首先,我们根据需要回传的数据定义一个事件数据提供类型,在这里我假设要回传两个数据,一个是整型(int),一个是字符串(string)那么定义下边的类.注意:这个类一定要从System.EventArgs继承
public class ReturnEventArgs:System.EventArgs
{
  public string strMsg;
public int intMsg;
public ReturnEventArgs()//编写构造函数,可以使用参数的形式直接构造字段或属性
{}
}
我们在Form2里定义1个代理:
public delegate void ReturnDataEventHandler(object sender,ReturnEventArgs e);
再定义一个事件
public event ReturnDataEventHandler ReturnMsg;
在窗体中再添加一个按钮,在按钮的单击事件里写下:
public void button1_click(object sender,System.EventArgs e)
{
ReturnEventArgs rea=new ReturnEventArgs();
rea.strMsg="字符串参数";
rea.intMsg=100;
if(ReturnMsg!=null)//加此判断的作用是为了在此事件未实现的时候不会出现错误
{
ReturnMsg(this,rea);
}
}
在Form1里生成Form2的时候:
Form2 frm=new Form2();
frm.ReturnMsg+=Form2.ReturnMsg(frm_ReturnMsg);
并直接生成事件处理函数
public void frm_RetrunMsg(object sender,ReturnEventArgs e)
{
//这里就可以直接使用事件数据类e所包含的数据
string str=e.strMsg;
int i=e.intMsg;
}

以上的方法可能在很多书中介绍了,也可能有很多人已经会了,但这可是偶无师自通的.
如果大家有更好的方法请告诉我,谢谢大家
这里的语句都是偶在论坛里手动写的,可能有错误,不过我这里讲的是方法不是代码,如有错误请大家见谅!

搜索更多相关主题的帖子: 窗体 数据 
2006-02-26 22:44
ytyt654
Rank: 2
等 级:新手上路
威 望:4
帖 子:195
专家分:0
注 册:2006-2-13
得分:0 
受益

2006-02-27 11:35
whipk
Rank: 1
等 级:新手上路
帖 子:21
专家分:0
注 册:2006-2-28
得分:0 

不是特别明白您的意思,有点晕.能不能放个源代码上来啊!谢谢了


.NET大海里的一条鱼
2006-03-01 13:46
ppislander
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2005-11-16
得分:0 
第一种好理解,第二种有点难
2006-03-06 22:03
月夜枫华
Rank: 4
等 级:贵宾
威 望:12
帖 子:437
专家分:42
注 册:2006-1-2
得分:0 
最近手头的项目比较多,过几天闲下来做个例子给大家看下.

2006-03-06 22:44
非主流
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2005-5-29
得分:0 
还不错,仔细看看

2006-03-06 23:38
laplas
Rank: 1
等 级:新手上路
帖 子:110
专家分:0
注 册:2006-2-28
得分:0 
代理和事件的概念,我还没弄清楚呢
任重道远啊
2006-03-07 09:03
jack033
Rank: 1
等 级:新手上路
帖 子:64
专家分:0
注 册:2006-1-2
得分:0 

laplas一样,代理和时间不怎么懂啊!


我还是新手,在以后希望能得到大家的帮助~~~~
2006-04-13 11:01
Crane
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2006-5-8
得分:0 

好贴!受益啊
谢谢LZ!

2006-05-17 10:32
keikei
Rank: 2
等 级:新手上路
威 望:4
帖 子:152
专家分:0
注 册:2006-5-15
得分:0 
public void frm_RetrunMsg(object sender,ReturnEventArgs e)
{
//这里就可以直接使用事件数据类e所包含的数据
string str=e.strMsg;
int i=e.intMsg;
}
ReturnEventArgs 在主窗体应该怎么声明,否则出错如下:
2006-05-19 17:22



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-47337-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.101827 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved