首页 后端开发 C#.Net教程 WinForm开发,窗体显示和窗体传值

WinForm开发,窗体显示和窗体传值

Dec 20, 2016 pm 03:10 PM

以前对WinForm窗体显示和窗体间传值了解不是很清楚
最近做了一些WinForm开发,把用到的相关知识整理如下

A.WinForm中窗体显示
显示窗体可以有以下2种方法:
Form.ShowDialog方法 (窗体显示为模式窗体)
Form.Show方法 (窗体显示为无模式窗体)

2者具体区别如下:
1.在调用Form.Show方法后,Show方法后面的代码会立即执行
2.在调用Form.ShowDialog方法后,直到关闭对话框后,才执行此方法后面的代码
3.当窗体显示为模式窗体时,单击“关闭”按钮会隐藏窗体,并将DialogResult属性设置为DialogResult.Cancel
  与无模式窗体不同,当用户单击对话框的关闭窗体按钮或设置DialogResult属性的值时,不调用窗体的Close方法
  实际上是把窗体的Visible属性赋值为false,隐藏窗体了
  这样隐藏的窗体是可以重新显示,而不用创建该对话框的新实例
  因为未关闭窗体,所以在应用程序不再需要该窗体时,请调用该窗体的Dispose方法

怎么判断一个窗体是模式窗体呢?
利用Form.Modal属性,如果该窗体是模式显示,则为true,否则为false
根据通过Show和ShowDialog而显示出来的窗体的Modal属性分别对应false和true
特别注意:
由于在窗体创建之前是无法得知显示方式的,所以在窗体构造函数中,Modal属性总是对应false,所以我们只能在Load事件中或者之后利用Modal属性值

怎么确定窗体间的所有者关系?
Form类的Owner属性:窗体的所有者
当一个窗体归另一窗体所有时,它便随着所有者窗体最小化和关闭。
例如,如果Form2归窗体Form1所有,则关闭或最小化Form1时,Form2也会关闭或最小化。

例如在窗体Form1中
Form2 f2 = new Form2 ( );
f2.ShowDialog ( this ); 
//或者 
f2.Show ( this );
//或者
f2.Owner = this;
f2.ShowDialog( );

这样f2的所有者就是Form1

B.WinForm窗体传值
了解了窗体的显示相关知识,接着总结一下窗体的传值方法:

1.通过构造函数
特点:传值是单向的(不可以互相传值),实现简单
实现代码如下:
在窗体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

2.通过静态变量
特点:传值是双向的,实现简单
实现代码如下:
在一个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赋值,以便其他窗体调用

3.通过窗体的公有属性值
特点:实现简单
实现代码如下:

在窗体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 (  );

4.通过窗体的公有属性值和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;

5.通过窗体的公有属性值和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;
}

6.通过事件
实现代码如下:
在窗体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; 
}


本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1663
14
CakePHP 教程
1420
52
Laravel 教程
1313
25
PHP教程
1266
29
C# 教程
1238
24
测试C#.NET应用程序:单元,集成和端到端测试 测试C#.NET应用程序:单元,集成和端到端测试 Apr 09, 2025 am 12:04 AM

C#.NET应用的测试策略包括单元测试、集成测试和端到端测试。1.单元测试确保代码的最小单元独立工作,使用MSTest、NUnit或xUnit框架。2.集成测试验证多个单元组合的功能,常用模拟数据和外部服务。3.端到端测试模拟用户完整操作流程,通常使用Selenium进行自动化测试。

C#.NET:探索核心概念和编程基础知识 C#.NET:探索核心概念和编程基础知识 Apr 10, 2025 am 09:32 AM

C#是一种现代、面向对象的编程语言,由微软开发并作为.NET框架的一部分。1.C#支持面向对象编程(OOP),包括封装、继承和多态。2.C#中的异步编程通过async和await关键字实现,提高应用的响应性。3.使用LINQ可以简洁地处理数据集合。4.常见错误包括空引用异常和索引超出范围异常,调试技巧包括使用调试器和异常处理。5.性能优化包括使用StringBuilder和避免不必要的装箱和拆箱。

c#.net的持续相关性:查看当前用法 c#.net的持续相关性:查看当前用法 Apr 16, 2025 am 12:07 AM

C#.NET依然重要,因为它提供了强大的工具和库,支持多种应用开发。1)C#结合.NET框架,使开发高效便捷。2)C#的类型安全和垃圾回收机制增强了其优势。3).NET提供跨平台运行环境和丰富的API,提升了开发灵活性。

从网络到桌面:C#.NET的多功能性 从网络到桌面:C#.NET的多功能性 Apr 15, 2025 am 12:07 AM

C#.NETisversatileforbothwebanddesktopdevelopment.1)Forweb,useASP.NETfordynamicapplications.2)Fordesktop,employWindowsFormsorWPFforrichinterfaces.3)UseXamarinforcross-platformdevelopment,enablingcodesharingacrossWindows,macOS,Linux,andmobiledevices.

高级C#.NET教程:ACE您的下一次高级开发人员面试 高级C#.NET教程:ACE您的下一次高级开发人员面试 Apr 08, 2025 am 12:06 AM

C#高级开发者面试需要掌握异步编程、LINQ、.NET框架内部工作原理等核心知识。1.异步编程通过async和await简化操作,提升应用响应性。2.LINQ以SQL风格操作数据,需注意性能。3..NET框架的CLR管理内存,垃圾回收需谨慎使用。

c#.net适合您吗?评估其适用性 c#.net适合您吗?评估其适用性 Apr 13, 2025 am 12:03 AM

c#.netissutableforenterprise-levelapplications withemofrosoftecosystemdueToItsStrongTyping,richlibraries,androbustperraries,androbustperformance.however,itmaynotbeidealfoross-platement forment forment forment forvepentment offependment dovelopment toveloperment toveloperment whenrawspeedsportor whenrawspeedseedpolitical politionalitable,

C#作为多功能.NET语言:应用程序和示例 C#作为多功能.NET语言:应用程序和示例 Apr 26, 2025 am 12:26 AM

C#在企业级应用、游戏开发、移动应用和Web开发中均有广泛应用。1)在企业级应用中,C#常用于ASP.NETCore开发WebAPI。2)在游戏开发中,C#与Unity引擎结合,实现角色控制等功能。3)C#支持多态性和异步编程,提高代码灵活性和应用性能。

.NET中的C#代码:探索编程过程 .NET中的C#代码:探索编程过程 Apr 12, 2025 am 12:02 AM

C#在.NET中的编程过程包括以下步骤:1)编写C#代码,2)编译为中间语言(IL),3)由.NET运行时(CLR)执行。C#在.NET中的优势在于其现代化语法、强大的类型系统和与.NET框架的紧密集成,适用于从桌面应用到Web服务的各种开发场景。

See all articles