WinForm窗体间传值的方法

本文实例讲述了WinForm窗体间传值的方法。分享给大家供大家参考。具体实现方法如下:

窗体间传递数据,无论是父窗体操作子窗体,还是子窗体操作符窗体,有以下几种方式:
 
1.公共静态变量;
2.使用共有属性;
3.使用委托与事件;
4.通过构造函数把主窗体传递到从窗体中;

一、通过静态变量

特点:传值是双向的,实现简单
 
实现代码如下:
在一个app类中定义一个静态成员value

代码如下:

public class app
{
public static string value;
}

在窗体Form1中这样调用

代码如下:

app.value = "f2"; //给静态成员赋值
new Form2 ( ).Show ( ); //显示Form2

在窗体Form2中

代码如下:

this.Text = app.value; //取回app.value的值
app.value = "Form2"; //给app.value赋值,以便其他窗体调用

二、公共变量传值

这种方法就是利用一个公共变量,先把需要的值存放到这个公共变量,然后需要的时候再通过读取该变量的值来使用
例子
Form1:

代码如下:

public static string Form1Value; // 注意,必须申明为static变量
private void button1_Click(object sender, EventArgs e)
{
Form1Value = "来自Form1";
new Form2().Show();
}

Form2:

代码如下:

private void Form_Load(object sender, EventArgs e)
{
MessageBox.Show(Form1.Form1Value);
}

这种方式传值,理解和使用上都相对的简单,但是容易让变量串值,比如第一次修改为“a”,而第二次修改为“b”,则有可能本来需要“a”值的结果变成了“b”。
 
三、静态方法方式访问

这种方法与传值方法的第一种有些类似,就是将需要被其他窗体访问的方法用static定义,以便其他传递可以直接访问到
例子:
Form1:

代码如下:

private void button1_Click(object sender, EventArgs e)
{
new Form2().Show();
}
public static void FF()
{
MessageBox.Show("Form1方法");
}

Form2:

代码如下:

private void Form_Load(object sender, EventArgs e)
{
Form1.FF();
}

使用这种方法访问其他窗体的方法,在跨窗体上实现方便,但是需要需要访问到控件值则不能直接访问,需要将值先传递给其他窗体,再有窗体传递回来,或者存储在其他变量后对这变量进行访问。
 
四、通过窗体的公有属性值

特点:实现简单
 
实现代码如下:
在窗体Form2中定义一个公有属性Form2Value,获取和设置textBox1的文本值

代码如下:

public string Form2Value
{
get
{
return this.textBox1.Text;
}
set
{
this.textBox1.Text = value;
}
}

在窗体Form1中这样调用

代码如下:

Form2 f2 = new Form2 ( );
f2.Form2Value = "Ok"; //给Form2的textBox1赋值Ok
f2.ShowDialog ( );

五、通过窗体的公有属性值和Owner属性

特点:实现简单,灵活
 
实现代码如下:
在窗体Form1中

代码如下:

public int Form1Value = 1;
Form2 f2 = new Form2 ( );
f2.ShowDialog ( this ); //把Form1作为Form2的所有者传递给Form2

在窗体Form2中

代码如下:

//Form2的所有者是Form1
Form1 f1 = ( Form1 ) this.Owner;
//取到Form1的值是1
MessageBox.Show ( f1.Form1Value .ToString ( ) );
//给Form1的Form1Value赋值222
f1.Form1Value = 222;

六、通过窗体的公有属性值和Application.OpenForms属性

说明:Application.OpenForms属性:获取属于应用程序的打开窗体的集合。(此属性在 .NET Framework2.0版中)
 
实现代码如下:
在窗体Form1中

代码如下:

public int Form1Value = 1;
Form2 f2 = new Form2 ( );
f2.Show ( );

在窗体Form2中

代码如下:

string formName = "Form1";
Form fr = Application.OpenForms [ formName ];
if ( fr != null )
{
Form1 f1 = ( Form1 ) fr;
//取到Form1的值是1
MessageBox.Show ( f1.Form1Value.ToString ( ) );
//给Form1的Form1Value赋值222
f1.Form1Value = 222;
}

七、传参式传值

此方法顾名思义就是将需要的值一参数形式传递给需要值的窗体
例子:
Form1:

代码如下:

private void button1_Click(object sender, EventArgs e)
{
new Form2("来自Form1").Show();
}

Form2:

代码如下:

public Form2(string value)
{
InitializeComponent();
MessageBox.Show(vaue);
}

此种窗体间传值方法明显优与第一种的传值参数,也不会出现串数据现象,但是需要注意修改Form2的构造函数,每个窗体的默认构造函数默认都是无参数的,因此需要去修改构造函数。
 
八、通过构造函数

特点:传值是单向的(不可以互相传值),实现简单
 
实现代码如下:
在窗体Form2中

代码如下:

int value1;
string value2;
public Form2 ( int value1 , string value2 )
{
InitializeComponent ( );
this.value1 = value1;
this.value2 = value2;
}

在窗体Form1中这样调用

代码如下:

new Form2 ( 111 , "222" ).Show ( ); //这样就把111,"222",这2个值传送给了Form2

 
九、用委托来实现。

委托可以把一个方法作为参数带入另一个方法,在窗体传值中,子窗体需要执行一个方法来改变父窗体的值,
而这个方法,则可以用委托从父窗体传递过来。在父窗体中,声明修改文本框的方法AfterChildChange,在new一个子窗体的时候,将这个方法传递给子窗体。那么当子窗体点击同步按钮时,会执行父窗体的AfterChildChange方法,已达到修改文本框值的目的。
 
例子
1、在子窗体中设置一个委托类型的属性:

代码如下:

public Action<string> AfterChangeTextDel { get; set; }

2、在子窗体同步按钮中:

代码如下:

if (AfterChangeTextDel != null)
{
AfterChangeTextDel(this.textBox1.Text);//执行委托
}

3、在父窗体中添加方法:

代码如下:

public void AfterChildChange(string text)
{
txtName.Text = text;
}

4、在父窗体启动子窗体按钮:

代码如下:

ChildFrm frm =new ChildFrm();
frm.AfterChangeTextDel = new Action<string>(this.AfterChildChange);
frm.Show();

5、这样也能实现窗体传值,子窗体的委托可以在父窗体 其他地方可以进行直接执行。:解决此问题。微软引入了事件。
 
十、用事件来实现

事件是委托类型的对象。它内部是用委托来实现的,对于事件来说,外部只能注册自己+=,注销自己-=,外界不可以注销其他的注册者,也不能主动触发事件。而委托则无法实现这些控制,因此诞生了事件这话总语法。
 
实现代码如下
在窗体Form2中定义公有属性Form2Value,获取和设置textBox1的文本值
并且还定义一个accept事件

代码如下:

public string Form2Value
{
get
{
return this.textBox1.Text;
}
set
{
this.textBox1.Text = value;
}
}
public event EventHandler accept;
 
private void button1_Click ( object sender , EventArgs e )
{
if ( accept != null )
{
accept ( this , EventArgs.Empty ); //当窗体触发事件,传递自身引用
}
}

在窗体Form1中

代码如下:

Form2 f2 = new Form2 ( );
f2.accept += new EventHandler ( f2_accept );
f2.Show ( );
void f2_accept ( object sender , EventArgs e )
{
//事件的接收者通过一个简单的类型转换得到Form2的引用
Form2 f2 = (Form2) sender;
//接收到Form2的textBox1.Text
this.textBox1.Text = f2.Form2Value;
}

希望本文所述对大家的C#程序设计有所帮助。

(0)

相关推荐

  • C#,winform,ShowDialog,子窗体向父窗体传值

    调用showdialog方法后,调用代码被暂停执行,等到调用showdialog方法的窗体关系后再继续执行.而且窗体可以返回一个dialogresult值,他描述了窗体关闭的原因,例如OK,Cancel,yes,no等.为了让窗体返回一个dialogresult,必须设置窗体的dialogresult值,或者在窗体的一个按钮上设置dialogresult属性. 例子: 下面是子窗体代码,要求输入phone,然后会返回给父窗体. using System; using System.Collect

  • c#中Winform实现多线程异步更新UI(进度及状态信息)

    引言 在进行Winform程序开发需要进行大量的数据的读写操作的时候,往往会需要一定的时间,然在这个时间段里面,界面ui得不到更新,导致在用户看来界面处于假死的状态,造成了不好的用户体验.所以在大量数据操作的应用上,需要使用多线程来处理这种情况.在c#中使用多线程很方便只需要使用System.Threading.Thread的一个实例的Start方法就行了,但是如何实现多线程之间的交互就不是那么简单.本文实现了用子线程去处理数据,并实时更新主线程的ui状态了.下面就开始一步步的去实现异步线程更新

  • WinForm中的登录实现

    在一般的C/S系统中,登录功能基本上是必备功能, 总结了三种C# Winform登录功能的实现方法. 第一种:在应用程序设置代码里(Program.cs)将应用程序入口改成系统主窗口 听起来有点绕,就是说,在应用程序初始化时,第一个加载的页面是我们登录后的主页面. 1.在Program.cs文件中设置Application.Run: 复制代码 代码如下: Application.Run(new FormMain());//设置应用程序运行时加载的窗口 2.添加登录按钮事件private void

  • c# winform多线程的小例子

    在文本框中输入一个数字,点击开始累加按钮,程序计算从1开始累计到该数字的结果.因为该累加过程比较耗时,如果直接在UI线程中进行,那么当前窗口将出现假死.为了有更好的用户体验,程序启动一个新的线程来单独执行该计算,然后每隔200毫秒读取一次累加结果,并把结果显示到文本框下方的label控件中.同时,程序支持取消操作,点击取消累计按钮,程序将取消累加操作,并把当前累加值显示到label中.为了方便后面的描述,我把UI线程称作主线程,把执行累加计算的线程称作工作者线程.该过程有两个关键点: 1:如何在

  • .NET WinForm实现在listview中添加progressbar的方法

    本文实例讲述了.NET WinForm实现在listview中添加progressbar的方法.分享给大家供大家参考,具体如下: 找了好长时间没找到,后来索性自己写了一个: 首先,在往listview加载数据的事件里添加progressbar: foreach (string d in arr) { int index = lv.Items.Count + 1; item = new ListViewItem(new string[] { index.ToString(), d, ""

  • C#中WinForm程序退出方法技巧总结

    本文实例总结了C#中WinForm程序退出方法技巧.分享给大家供大家参考.具体分析如下: 在c#中退出WinForm程序包括有很多方法,如:this.Close(); Application.Exit();Application.ExitThread(); System.Environment.Exit(0); 等他们各自的方法不一样,下面我们就来详细介绍一下. 1.this.Close();   只是关闭当前窗口,若不是主窗体的话,是无法退出程序的,另外若有托管线程(非主线程),也无法干净地退

  • C# WinForm中禁止改变窗口大小的方法

    本文介绍在使用C#开发WinForm窗体程序时,如何设置窗体的大小不能被改变. 我们在开发一个窗体(WinForm)程序时,所有的控件都部署在程序界面上了,如果这时来把窗体的大小调整一下,那界面就难看了.怎么设置窗体大小不能被修改呢? 在Form类下面有一个FormBorderStyle的字段,我们可以通过设置它的值来让窗体不能被拉大拉小.FormBorderStyle的值设置为FormBorderStyle.FixedSingle或Fixed3D时,窗体大小是不能被改变的. 当然,还有一种情况

  • WinForm中DataGridView添加,删除,修改操作具体方法

    1.添加操作,代码如下: 复制代码 代码如下: IList<SelfRun> selfRunConfigs = new List<SelfRun>();private void btnNewConfig_Click(object sender, EventArgs e){try{string _lampNo = UpDownSelfLampNo.Value.ToString();int _ctrlGpNo = Convert.ToInt16(UpDownCtrlGpCnt.Valu

  • WinForm中快捷键与组合按键的设置方法

    第一种方法..代码复杂,操作简单的快捷键 新建一个空白窗体 每个窗体都有这样3个事件:KeyDown.KeyPress.KeyUp,KeyDown和KeyPress都是按键按下事件,但KeyDown用的是KeyCode跟键盘各个按键相对应,它对应Keys枚举,用起来比较方便:而KeyPress用的是KeyChar,这个就要找ASC II编码了,不方便.KeyUp是按键弹起事件,不常用,因此我们使用KeyDown事件来设置窗体的快捷键,双击该事件后的空白生成代码,首先我们设置单个按键,让它按下F1

  • C# Winform下载文件并显示进度条的实现代码

    方法一: 效果如下图所示: 代码如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WinShowDown { public partial class F

  • C# Winform 禁止用户调整ListView的列宽

    复制代码 代码如下: // 事件: 改变列宽的时候 private void ColumnWidthChange(object sender, ColumnWidthChangingEventArgs e) { // 如果调整的不是第一列,就不管了 if (e.ColumnIndex > 0) return; // 取消掉正在调整的事件 e.Cancel = true; // 把新宽度恢复到之前的宽度 e.NewWidth = this.lvStudents.Columns[e.ColumnIn

随机推荐