由于之前做采场顶板控制设计系统时用到了窗体间的相互引用,所以这里做了下简单的总结,希望多迷惑的同事有所帮助。
方法一:窗体间简单的引用。一个窗体调用另一个窗体的变量或控件。
如form4调用form3中的变量:只需要把form3中的变量设置为public类型,然后在form4中new一个form3,直接就可以调用了。
如form4调用form3中的控件:同样只要在Form3.Designer.cs里面把空间的访问类型设置为public即可,ep:public 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,然后再创建子窗体Form1和Form2。这里我们在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静态类,然后定义静态变量a,b以及方法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,如果他们不在同一个命名空间中还要在类名前加上空间名称;另一个地方需要注意的是静态类没有构造函数,不能实例化关于静态类更多的知识可以参考其他资料。
分享到:
相关推荐
C#winform窗体间传值,三种方法示例,注释详细。使用方法:使用vs2013打开编译运行即可; 工程中总共介绍了三种方法: ###方法1:通过保存对象的引用调用其方法实现对子窗体的控制; ###方法2:通过委托,在子窗体...
C# WinForm通过全局变量实现不同窗体之间传值的解决方案的源码
示例演示了两个窗体一个是登录窗口,一个是工作窗口,两个共享变理
C#中在一个窗体里调用另一个窗体的方法;C#不同窗体方法调用
c# 委托,子窗体往父窗体传值、调用方法,DEMO,完整代码,visual studio2010
在做一个联系人管理的C#设计时,遇到了这个问题,我需要将父窗体中的textBox中的值传到子窗体并进行数据库查询操作,我用了new 父窗体().textBox.text;来进行值传递,然而并无卵用,经过多次试验,找到了一个比较...
C#(winform)里子窗体修改父窗体(子窗体刷新父窗体数
C#事件监视变量变化,事件推送机制,用于变量绑定场景,后台出发前台更新操作
小编最近维护一个Winfrom窗体,是项目中CS端的主窗体,很多子窗体需要从主窗体获取值,同时子窗体还需要给主窗体回传值,下面来给大家介绍一下。 正文 本文中以主窗体为frmMain,子窗体为frmGroup ,两窗体之间的...
* 鼠标按下时更改变量isMouseDown标记窗体可以随鼠标的移动而移动 * 鼠标移动时根据鼠标的移动量更改窗体的location属性,实现窗体移动 * 鼠标弹起时更改变量isMouseDown标记窗体不可以随鼠标的移动而移动 */
使用委托实现winform跨窗体传值 高效可重用的窗体 减少窗体类的耦合 比全局变量有很多优势,下载一看便知 源码完整,下载即可运行 vs2005开发
winform 窗体间互相传值 1. 静态变量法 ValueHelper 2. 直接跨窗体调用 public string tempValue; public TextBox1 .... targetForm tF = new Form(); tF.tempValue = this.txt1.TextValue; tF.show() this.Hide()...
自定义窗体的最大化、最小化和关闭按钮, C#移动无标题栏窗体的三种代码: C#移动无标题栏窗体的三种代码:第一种采用,需注意窗体上的控件是否把窗体覆盖了。。。MouseDown、MouseMove、MouseUp事件应该是鼠标所...
C#中没有了像VB.Net中的全局变量,那么我们如何实现在不同的页面间传递参数呢? 下面举例说明如何实现这一功能. 1.新建一个项目. 2.在该工程中添加一个窗体Form1. 3.在该窗体中定义静态型字符串变量myTestStr1: ...
通过自定义控件库来动态的向Winform窗体中添加用户控件
C# 使用Usercontrol与主窗体进行消息传递,利用Usercontrol里面的控件控制主窗体上的控件;利用主窗体的控件改变Usercontrol里面控件的属性
C#三种窗体之间传值全局变量、构造函数、委托,思路:构造函数和委托传递多个参数,可考虑将多个变量封装集合或者结构体,传递集合或结构体即可。
C# WinForm之间调用、窗口之间相互传递参数的例子
《CLR via C#(第3版) 》针对.NET Framework 4.0和多核编程进行了全面更新和修订,是帮助读者深入探索和掌握公共语言运行时、C#和.NET开发的重要参考,同时也是帮助开发人员构建任何一种应用程序(如Microsoft ...
本小程序主要展示WinForm用户控件的使用及相互之间的通信,这里主要是通过事件进行实现的,第一个用户控件:(UCForm1.cs)主要包含一个文本框,第二个用户控件:(UCForm2.cs)包含了一个DataGridView和一个文本框,...