这段时间写代码又涉及到了窗体间通信的内容,把我所掌握的几种方法归纳一下。非计算机科学出身,内容比较浅显,术语多有错误,难免有出错,过往游客如有所查,请留言斧正,有好方法这不惜赐教。所列这种方法有何不足也请留言赐教。
方法一)主窗体实例化
这个方法基本是万能了,可能在专业的代码编写人员看来会比较不安全
1 public partial class MainWin : Form
2 {
3 //将主窗体创建一个句柄,在初始化的时候给其赋值
4 //方便子窗体引用主窗体的Public型成员
5 public static MainWin pMainWin = null;
6 public MainWin()
7 {
8 InitializeComponent();
9 //方便子窗体引用主窗体的Public型成员
10 pMainWin = this;
11 }
12 …………………………
13 }
这种方法适用于子窗体访问子窗体,子窗体访问父窗体,但是所访问的对象须是public类型,举例说明:
a.子窗体FormA访问子窗体FormB
FormB中有public类型的变量GlobalControl
则在FormA中通过语句可实现
MainWin.pMainWin.GlobalControl;
b.子窗体FormA访问父窗体 MainWin
MainWin中有public类型的函数GlobalreFreshBitmap();
MainWin.pMainWin.GlobalreFreshBitmap();
方法二)事件 例如像点击子窗体按钮使得主窗体有所变化
在子窗体定义一个事件
public partial class Viewer : Form
{
public event EventHandler UpdateDataGridView = null;/
public static bool GlobalFlag; //该变量用来标识是否创建新的子窗体
那我现在想按下子窗体的Button使得主窗体有所变化
private void button_Click(object sender, EventArgs e)
{
GlobalFlag = true;
UpdateDataGridView(this, EventArgs.Empty);
}
至此,子窗体的代码已经写好了。然后完成主窗体的代码
在主窗体中初始化子窗体Viewer的时候呢,我们需要对这个事件做一个处理
private void OpenFile(object sender, EventArgs e)
{
Viewer tsxViewer = new Viewer();
tsxViewer.MdiParent = this;
tsxViewer.UpdateDataGridView += new EventHandler(BabyWindow_UpdateDataGridView);
tsxViewer.Show();
}
这里就把事件子窗体里定义的事件UpdateDataGridView给指定了具体的执行函数BabyWindow_UpdateDataGridView
下面。我们就在主窗体里面编写函数BabyWindow_UpdateDataGridView
void BabyWindow_UpdateDataGridView(object sender,EventArgs e)
{
if (Viewer.GlobalFlag==true)
{
……
}
}
3)主窗体访问子窗体就简单很多了
属性 或者其他什么方法都可以了,不赘述。
转发请注明出处。