c#各个窗体间变量和空间相互引用方法
2014-10-15 10:10
239 查看
方法一:窗体间简单的引用。一个窗体调用另一个窗体的变量或控件。
如form4调用form3中的变量:只需要把form3中的变量设置为public类型,然后在form4中new一个form3,直接就可以调用了。
如form4调用form3中的控件:同样只要在Form3.Designer.cs里面把空间的访问类型设置为public即可,ep:publicSystem.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();
}
}
方法四:主窗体Test新建一个变量:
private string _Bianhao;
/// <summary>
/// 报表项编号
/// </summary>
public string Bianhao
{
set { _Bianhao = value; }
get { return _Bianhao; }
}
主窗体打开子窗体:
Edit frm = new Edit();
frm.ShowDialog(this);
子窗体中:
Test frm = (Test)this.Owner;
frm.Bianhao = this.comboBox2.Text;
相信到这里您已经知道如何通过全局变量来时实现各个窗体间的变量应用了。以上代码需要注意的地方一个是命名空间Namespace NameSpace1,如果他们不在同一个命名空间中还要在类名前加上空间名称;另一个地方需要注意的是静态类没有构造函数,不能实例化关于静态类.更多的知识可以参考其他资料.
如form4调用form3中的变量:只需要把form3中的变量设置为public类型,然后在form4中new一个form3,直接就可以调用了。
如form4调用form3中的控件:同样只要在Form3.Designer.cs里面把空间的访问类型设置为public即可,ep:publicSystem.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();
}
}
方法四:主窗体Test新建一个变量:
private string _Bianhao;
/// <summary>
/// 报表项编号
/// </summary>
public string Bianhao
{
set { _Bianhao = value; }
get { return _Bianhao; }
}
主窗体打开子窗体:
Edit frm = new Edit();
frm.ShowDialog(this);
子窗体中:
Test frm = (Test)this.Owner;
frm.Bianhao = this.comboBox2.Text;
相信到这里您已经知道如何通过全局变量来时实现各个窗体间的变量应用了。以上代码需要注意的地方一个是命名空间Namespace NameSpace1,如果他们不在同一个命名空间中还要在类名前加上空间名称;另一个地方需要注意的是静态类没有构造函数,不能实例化关于静态类.更多的知识可以参考其他资料.
相关文章推荐
- c#各个窗体间变量和空间相互引用方法
- c#各个窗体间变量和空间相互引用方法
- 今天看了clr via c# 知道了在debug和release下垃圾回收针对方法中局部引用变量jit的操作是不一样的,留此文纪念。
- C# 两个窗体中相互切换的方法
- 一道理解c#中对象(引用类型)相互赋值和方法覆盖(overriding)的题目
- [C#]变量初始化问题:字段初始值无法引用非静态字段、方法或属性
- C#局域网中引用他人的WebService报“测试窗体只能用于来自本地计算机的请求方法”错的解决办法
- asp.net中前台js变量与后台c#的相互调用方法
- c#的aspx页面中引用了用户控件,如何相互调用后台方法
- 一道理解c#中对象(引用类型)相互赋值和方法覆盖(overriding)的题目
- C#变量初始化问题:字段初始值无法引用非静态字段、方法或属性
- 【转】c#实现在两个窗体(winform)之间传输数据或变量的方法
- 17.2015.08.04第十八节课 C#2 (数值类型及调用、引用类型及调用、装拆箱、常量、变量、数据类型转换、算术运算符、赋值运算符、关系运算符、逻辑运算符、字符串的常用方法)
- 关于html页面引用Ext自定义的命名空间的变量以及方法
- C#基础知识复习1代码规范-执行流程(c#)-面向对象-引用命名空间-封装-继承-访问修饰符-虚方法-静态成员-多态-抽象类等
- C# 类中变量初始化:字段初始值无法引用非静态字段、方法或属性
- 第一天,第一个C#程序,学习C#基本语法。掌握命名空间、类、变量、方法等基本概念。
- C# 引用其他命名空间的公共变量时的警告:由于"***"是引用封送类的字段,访问上面的成员可能导致运行时异常
- C#变量初始化问题:字段初始值无法引用非静态字段、方法或属性
- 总结C#中窗体间传递数据的几种方法 (由别人的方法整理)