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