正在学写一个应用程序,其中要在不同窗体之间传递数据,也在网上找了一些资料,总是觉得很麻烦,最简单的方法好象就是专门写一个类,在其中建立静态共有变量,然后利用这个类,来实现不同窗体之间的数据传递。但这样有一个问题,就是这个类需要多少个静态共有变量,在写程序的一开始是定不下来的,而且以后如果要新添加某些数据的传递,还要去修改这个“全局”的类。
请问各位老鸟,有没有更好,或是更简便的方法,来实现窗体之间的数据通信。
请问各位老鸟,有没有更好,或是更简便的方法,来实现窗体之间的数据通信。
调试欢乐多
namespace NewOPCClient
{
public partial class Main : Form
{
public Main()
{
InitializeComponent();
}
public myComOPC tmpComOPC = new myComOPC();//这里用public来实现,感觉不是这么回事。这里的myComOPC是自己写的类。我现在想在另外一个窗体里对tmpComOPC这个实例进行操作,难道只能用加public的方法吗?有没有更简单,或是更符合编程良好习惯的办法呢?
错误 1
可访问性不一致: 字段类型“NewOPCClient.myComOPC”比字段“NewOPCClient.Main.tmpComOPC”的可访问性低
E:\最新工业自动化\C#项目\NewOPCClient\NewOPCClient\Main.cs 22 26 NewOPCClient
那这个public加与不加,有什么区别呢?
不知道可不可以解决你说的这个问题?呵呵……
刚才试了一下,又发现新问题。在子窗体,对主窗体的myComOPC的实例tmpComOPC进行了连接后,再退回主窗体,发现连接断掉了。是不是C#的什么垃圾回收机制起作用了,自动把连接切断了,有没有什么办法解决呢?这其实还是通信问题吧,把信息(变量,类的实例)传递出去,再接受回来。
在子窗体,对主窗体的myComOPC的实例tmpComOPC进行了连接后,再退回主窗体,发现连接断掉了。是不是C#的什么垃圾回收机制起作用了,自动把连接切断了,有没有什么办法解决呢?这其实还是通信问题吧,把信息(变量,类的实例)传递出去,再接受回来。
public static myComOPC tmpComOPC = new myComOPC();//in SubForm:
Main.tmpComPC=shit;
...
把你需要共享的类加入到hashtable中,在其他的窗口中使用就好了。
例如:
public class abc
{
public static HashTable hashdata = new HashTable();
//Do something....
}public class FrmMain: Form
{
public FrmMain()
{
abc.hashdata("FrmMain", this);
}
public void AFunction()
{
}
}public class FrmTemp: Form
{
public FrmTemp()
{
FrmMain FrmMainA = null;
foreach(DictionayEntry de in hashdata)
{
if(de.Key.ToString() == "FrmMain")
{
FrmMainA = (Form)de.Value;
break;
}
}
FrmMainA.AFunction();
}
}
我一般是改子窗体的构造函数,在父窗体调用的时候
new form(this);
这样就可用父窗体的变量了
不知是不是答非所问……
对象一样可以传
this是主窗口的指针
在子窗口中可以用这个this调用任何主窗口的public对象
//1、用静态变量,就是LZ说的
//2、在主窗体声明一个属性,然后在打开的窗体就可以访问了//主窗体MainForm
private string username;
public string UserName
{
get{return "aaaaaaaa";}
set{username=value;}
}
//打开的窗体Form1
((MainForm)this.Own).UserName="dgd";
//3、构造函数
//打开的窗体Form1,添加一个构造函数或者直接修改也可以
private string username;
public Form1(string username):Form1()
{
this.username=username;
}//4、委托事件
//比如在打开的窗体点击按钮修改主窗体的TextBox
//先在打开的窗体声明委托和事件
public delegate void aa();//参数自己定义//然后在类里面声明事件public event aa aaEvent;protected virtual void OnaaEvent()
{
if(aaEvent!=null)
{
aaEvent();
}
}//再次在点击按钮中引发事件
private void Buttom1_Click(object sender,EventArgs e)
{
//其他代码
OnaaEvent();
}
//最后在主窗体注册事件Form1 f1=new Form1();
f1.aaEvent+=delegate(){MessageBox.Show("LZ给我分吧")}
通常做法不需要静态的数据了,而是一个普通的类就可以了
然后在新的窗体中通过构造函数参数传递该类(在VC++里叫 Document)
例如:MainForm
{
///这个类存放相关信息
Doc MainFormDoc;
}NForm
{
Doc NFormDoc;
NForm(Doc pDoc)
{
NFormDoc=pDoc;
}
}这样通过修改pDoc的数据就可以实现全局数据更新,如果要使用主窗体,可以在定义Doc时包含:Doc
{
MainForm mMainForm;
}这样所有的窗体和数据都可以实现交互了.