`
k_lb
  • 浏览: 800601 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论
  • kitleer: 据我所知,国内有款ETL调度监控工具TaskCTL,支持ket ...
    kettle调度

c#各个窗体间变量和空间相互引用方法

 
阅读更多

由于之前做采场顶板控制设计系统时用到了窗体间的相互引用,所以这里做了下简单的总结,希望多迷惑的同事有所帮助。

方法一:窗体间简单的引用。一个窗体调用另一个窗体的变量或控件。

form4调用form3中的变量:只需要把form3中的变量设置为public类型,然后在form4new一个form3,直接就可以调用了。

form4调用form3中的控件:同样只要在Form3.Designer.cs里面把空间的访问类型设置为public即可,eppublic System.Windows.Forms.Label label1;

//Form3.cs

public partial class Form3 : Form

{

public Form3()

{

InitializeComponent();

}

public string p = "f3";//公有变量

}

//Form3.Designer.cs

partial class Form3

{

#region Windows Form Designer generated code

……

#endregion

public System.Windows.Forms.Label label1;//公有控件

//Form4.cs

private void Form4_Load(object sender, EventArgs e)

{

Form3 f3 = new Form3();

f3.p = "f4";

f3.label1.Text = "sad"+f3.p;

f3.Show();

}

方法二:对于mdi项目来说,我们有时可能会同时打开多个子窗体,并且需要在各个窗体间相互传递参数或引用,而且又不能每次使用都new一次。此时对他们的操作就相对麻烦点。

mdi项目首先要把父窗体的IsMdiContainer属性设置为true,使其作为mdi项目的父窗体假如这里的父窗体为Mainform,然后再创建子窗体Form1Form2。这里我们在Form2的实例化窗体f2中使用Form1窗体的实例f1,并且这个f1窗体和f2窗体始终存在。在Form2中添加一个按钮button1名称叫“显示Form1”,它的单击事件如

private void button1_Click(object sender, EventArgs e)

{

Form1 f1 = null;

bool find = false;

foreach (Form f in this.MdiParent.MdiChildren)//这里的this就是指Form2

{

if (f is Form1)

{

f1 = (Form1)f;

f1.Show();

f1.Focus();

find = true;

break;

}

}

if (find == false)

{

f1= new Form1();

f1.MdiParent = this.MdiParent;

f1.Show();

}

}

Mainform窗体的Load事件

private void Mainform_Load(object sender, EventArgs e)

{

Form2 f2 = new Form2 ();

f2.Show();

}

运行程序,其结果就是无论点击多少次f2中的“显示Form1”按钮,始终打开的是同一个窗体,并且f1就是Form1窗体的这个实例化窗体,而不会每次点击按钮就new一个Form1窗体。

这里的原理就是搜索所有mdi父窗体(即Mainform)的子窗体名称等于Form1的窗体,如果搜索到则显示出来(然后就可以对f1进行其他操作了),否则创建新的form1窗体,然后设置其父窗体为Mainform并显示出来。

方法三:这次我们就用静态类(也就是全局变量)来实现各个窗体间的引用。例如我们创建一个StaticClass静态类,然后定义静态变量ab以及方法GetSum()

Namespace NameSpace1

{

public static class StaticClass

{

public static int a;

public static int b;

public static int GetSum()

{

return a + b;

}

}

}

在使用时我们直接调用这个静态类就行,而不需要进行实例化(当然你也实例不了,呵呵)

Namespace NameSpace1

{

private void Form1_Load(object sender, EventArgs e)

{

StaticClass.a = 12;

StaticClass.b = 2;

int sum = StaticClass.GetSum();//sum=14

int sum2=getsum2();//sum2=14

}

Public int getsum2()

{

return StaticClass.GetSum();

}

}

相信到这里您已经知道如何通过全局变量来时实现各个窗体间的变量应用了。以上代码需要注意的地方一个是命名空间Namespace NameSpace1,如果他们不在同一个命名空间中还要在类名前加上空间名称;另一个地方需要注意的是静态类没有构造函数,不能实例化关于静态类更多的知识可以参考其他资料。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics