C#窗体之间信息通信,主窗体与子窗体,子窗体与子窗体,子窗体与主窗体

这段时间写代码又涉及到了窗体间通信的内容,把我所掌握的几种方法归纳一下。非计算机科学出身,内容比较浅显,术语多有错误,难免有出错,过往游客如有所查,请留言斧正,有好方法这不惜赐教。所列这种方法有何不足也请留言赐教。

方法一)主窗体实例化

这个方法基本是万能了,可能在专业的代码编写人员看来会比较不安全

 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)主窗体访问子窗体就简单很多了

属性 或者其他什么方法都可以了,不赘述。

转发请注明出处。