c# WinForm 窗体之间传值的几种方式(小结)

前言

小编最近维护一个Winfrom窗体,是项目中CS端的主窗体,很多子窗体需要从主窗体获取值,同时子窗体还需要给主窗体回传值,下面来给大家介绍一下。

正文

本文中以主窗体为frmMain,子窗体为frmGroup ,两窗体之间的传值来做示例。

方式一: 使用公共静态变量传值

主窗体frmMain中代码

public partial class frmMain : Form
{
 //声明工位ID 为公共静态变量
 public static string terminalID = "";
 //给静态变量赋值
 terminalID = "q13bh01-bh12";
 }

子窗体frmGroup中代码

 private void frmGroup_Load(object sender, EventArgs e)
{
  this.txtTerminalID.Text= frmMain.terminalID.Trim();
  //可以再赋值给静态成员,方便其他窗体调用
  frmMain.terminalID = "q13bh01-bh11";
}

特点 : 双向传值,实现简单
缺点: 静态变量在类加载的时候分配内存,存储于方法区,一般不会被销毁,在系统不够内存情况下会自动回收静态内存,这样就会引起访问全局静态错误。

方式二: 使用公共变量传值

主窗体frmMain中代码

public partial class frmMain : Form
{
 //声明工位ID 为公共变量
 public string terminalID = "";
 //给变量赋值
 terminalID = "q13bh01-bh12";
 //单击‘行为'按钮的时候会给窗体传值
 private void btnGroup_Click(object sender, EventArgs e)
    {
      frmGroup frmGro = new frmGroup();
      //变量传值 ,注意顺序写在ShowDialog()方法之前
      frmGro .stationID = this.terminalID;
      frmGro .ShowDialog();
    }
 }

子窗体frmGroup中代码

 public partial class frmGroup : Form
 {
  //定义公共属性
  public string stationID = "";
 }

特点 : 单向传值,只能主窗体给子窗体传值,实现简单

方式三: 使用委托传值

先来看子窗体frmGroup中代码

namespace Siemens.Simatic.GUIClient.MESClient
{
  //1、声明一个委托
  public delegate void setTextValue(string textValue,bool flag);
  public partial class frmGroup : Form
  {
    //2、声明一个委托类型的事件
     public event setTextValue setFormTextValue;
     public string groupName = "";
     public bool flagBtnGroup = false;
     public frmGroup()
     {
      InitializeComponent();
     }
     //轮询‘行为'按钮(相当于按钮单击事件)
     private void tmrBtn_Tick(object sender, EventArgs e)
     {
      if (sender is ButtonX) {
        ButtonX butX = (ButtonX)sender;//判断触发事件的是不是Button
        groupName = butX.Text.Trim();
        flagBtnGroup = true;
        //3、准备要回传的数据。
        setFormTextValue(this.groupName.Replace(" ", ""), this.flagBtnGroup );
        this.Close();
        return;
      }
    }

主窗体frmMain中代码

 private void btnGroup_Click(object sender, EventArgs e)
    {
      frmGroup frmGro = new frmGroup();
       //4、初始化事件
      frmGro .setFormTextValue += new setTextValue(frmGro _setFormTextValue);
      //变量传值 ,注意顺序写在ShowDialog()方法之前
      frmGro .stationID = this.terminalID;
      frmGro .ShowDialog();
    }
    //5、事件具体实现
     public void frmGro _setFormTextValue(string textValue,bool flag)
    {
      this.newGroupName = textValue;
      this.flagBtnGroup = flag;
      if (!string.IsNullOrEmpty(newGroupName))
      {
         ……
      }
     }

特点 :适合子窗体数据实时回传父窗体。

方式四:使用构造函数传递一个数值

class FormB
{
 int orgId;
 public FormB(int orgId)
 {
   this.orgId=orgId;
 }
}

class FormA
{
public void ShowB()
{
  FormB fb=new FormB(5); // 5是要传递过去的值
  fb.Show();
}
}

方式五:把A窗体整个传递给B窗体

有些时候需要在B窗体里对A窗体的某个控件值做修改,并且需要立即改变A窗体的控件显示,本方法适合这种情况。

修改FormA,把要在B里处理的控件的可访问性(Modifiers)设为public,然后按下面的方式处理

class FormA
{
public void ShowB()
{
  FormB fb=new FormB(this); // 在构造函数里把A窗体本身传过去
  fb.Show();
}
}

class FormB
{
FormA fm; //B窗体增加一个FormA类型的成员
public FormB(FormA fm) //添加一个带参数的构造方法,参数类型是FormA
{
  this.fm=fm;
}
protected void Method1()
{
  fm.txtName.Text="Haha!"; //在这儿可以直接操作A窗体里的控件了!
}
}

叨叨两句

项目中父窗体向子窗体传值传的是固定值,用的是第一种方式,子窗体向父窗体传值传的是变化的值,用的是第三种方式,第三种方式为我解决了一个大麻烦。

总结

感谢您的阅读,窗体传值有好多种方法,构造参数参数传值、公共属性传值等,各种场景下找到适合需求的最好,希望为小编提出宝贵意见!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C# winform程序实现开机自启动并且识别是开机启动还是双击启动

    开机启动程序,在很多场合都会用到,尤其是那种在后台运行的程序. 效果图: 以上两幅图都用到了命令行启动程序,为了模拟开机启动或者其他程序调用此程序. 第一幅图:程序启动可以根据不同参数,执行不同的操作.如果是双击启动,就自动运行逻辑代码,如果是带特定参数启动,就自动运行逻辑代码. 第二幅图:winform 程序设置开机启动,模拟双击启动和开机启动的不同效果. 开机启动并自动运行方法:其实思路很简单,就是将程序添加到注册表中,这设置值的时候,加一个参数就可以了.然后程序在入口函数处判断启动参数,如

  • WinForm窗体间传值的方法

    本文实例讲述了WinForm窗体间传值的方法.分享给大家供大家参考.具体实现方法如下: 窗体间传递数据,无论是父窗体操作子窗体,还是子窗体操作符窗体,有以下几种方式:   1.公共静态变量: 2.使用共有属性: 3.使用委托与事件: 4.通过构造函数把主窗体传递到从窗体中: 一.通过静态变量 特点:传值是双向的,实现简单   实现代码如下: 在一个app类中定义一个静态成员value 复制代码 代码如下: public class app { public static string value

  • Winform窗体传值的方法(示例)

    进行用C#来开发windows应用程序项目时,不同窗口之间传值有很多种不同的方法, 假设项目中有两个窗体,Form1和Form2,要实现的效果是:点击Form1中的按钮打开From2,点击Form2中的按钮改变窗体Form1的背景颜色. 示例一: 点击Form1中的按钮打开From2,点击Form2中的按钮改变窗体Form1的背景颜色. Form1的代码: public partial class Form : Form { public Form() { InitializeComponent

  • WinForm IP地址输入框控件实现

    本文实例为大家分享了WinForm IP地址输入框控件的具体实现代码,供大家参考,具体内容如下 IPInput.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Text; using System.Windows.Forms; using System.Text.RegularE

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

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

  • C# Winform实现导入和导出Excel文件

    本文实例为大家分享了Winform实现导入导出Excel文件的具体代码,供大家参考,具体内容如下 /// <summary> /// 导出Excel文件 /// </summary> /// /// <param name="dataSet"></param> /// <param name="dataTable">数据集</param> /// <param name="isS

  • WINFORM 窗体间的传值实现解析

    源码  https://github.com/SHAREVIEW/winform_valnue-from-form-2-form_20190919.git 在WinForm之间传值有很多种方法,在这里我用的是delegate and event进行传值. 新建一个WindowsApplication,创建两个WinForm.其实它们就是两个类. 每个WinForm中各加入一个Button和一个TextBox. 在WinForm2中写入代理和事件(delegate and event)如下: //

  • c# WinForm 窗体之间传值的几种方式(小结)

    前言 小编最近维护一个Winfrom窗体,是项目中CS端的主窗体,很多子窗体需要从主窗体获取值,同时子窗体还需要给主窗体回传值,下面来给大家介绍一下. 正文 本文中以主窗体为frmMain,子窗体为frmGroup ,两窗体之间的传值来做示例. 方式一: 使用公共静态变量传值 主窗体frmMain中代码 public partial class frmMain : Form { //声明工位ID 为公共静态变量 public static string terminalID = "";

  • 详解ASP.NET 页面之间传值的几种方式

    开篇概述 对于任何一个初学者来说,页面之间传值可谓是必经之路,却又是他们的难点.其实,对大部分高手来说,未必不是难点. 回想2016年面试的将近300人中,有实习生,有应届毕业生,有1-3年经验的,有3-5年经验的,有5-10年经验的,对于所有的面试者,我几乎问了同一道题:"请说说你所知道的页面之间传值的几种形式和方法,并阐述他们的原理和过程",关于这道题,从大家的回答来看,结果并不是很理想,从种类上来说,大部分人回答5种左右,极少部分能回答8种,没有超过8种的,但从深度上来说,很少有

  • vue中兄弟组件传值的两种方式小结

    目录 一. bus总线传值的使用 二. 使用常规的传值:(子传父,父再传子) 总结 本demo主要是为了演示vue项目中兄弟组件之间的传值,这里我演示了两种方式: a. bus总线传值: b. 我自己一般把它当成常规的传值(其实也就是子组件A传父组件,父组件再传子组 件B) 下边开始本次demo的编写: 一. bus总线传值的使用 在项目中创建一个单独的eventBus.js文件 该js文件的内容很简单,就是暴露一个vue实例而已. 有人喜欢在main.js全局引入该js文件,我一般在需要使用到

  • Javascript showModalDialog两个窗体之间传值

    Javascript 两个窗体之间传值实现代码javascript中还有一个函数window.showModalDialog也可以打开一个新窗体,不过他打开的是一个模态窗口,那么如何在父窗体和子窗体之间传值呢?我们先看该函数的定义:vReturnValue = window.showModalDialog(sURL [, vArguments] [,sFeatures]) 参数说明: sURL--必选参数,类型:字符串.用来指定对话框要显示的文档的URL. vArguments--可选参数,类型

  • pyQT5 实现窗体之间传值的示例

    准备 一个MainWindow和一个WidgetForm,总代码如下 # -*- coding: utf-8 -*- from PyQt5 import QtWidgets from main_windows import Ui_MainWindow import sys from wid_defs import my_widgets from dlg_defs import my_Dialog class MyWindow(QtWidgets.QMainWindow,Ui_MainWindow

  • Backbone View 之间通信的三种方式

    在上篇文章给大家介绍了Backbone中View之间传值的学习心得.本文重点给大家介绍Backbone View 之间通信的三种方式. 掌握一个 MVC 框架,最关键的一节就是掌握如何在各个 View 之间通信.之前用 Angular 时,觉得基于事件的通信方式 ($on, $emit, $boardcast) 或者 基于 service 的方式都非常好用.转战 Backbone 之后,由于对 Backbone 的事件机制理解不够且使用非常灵活,一直没找到一个好的通信方式.直到看见这篇文章,作者

  • Flutter页面传值的几种方式

    今天来聊聊Flutter页面传值的几种方式: InheritWidget Notification Eventbus (当前Flutter版本:2.0.4) InheritWidget 如果看过Provider的源码的同学都知道,Provider跨组件传值的原理就是根据系统提供的InheritWidget实现的,让我们来看一下这个组件. InheritWidget是一个抽象类,我们写一个保存用户信息的类UserInfoInheritWidget继承于InheritWidget: class Us

  • 详解Vue组件之间通信的七种方式

    使用Vue也有很长一段时间,但是一直以来都没对其组件之间的通信做一个总结,这次就借此总结一下. 父子组件之间的通信 1)props和$emit 父组件通过props将数据下发给props,子组件通过$emit来触发自定义事件来通知父组件进行相应的操作 具体代码如下: ``` // 父组件 <template> <div> <h3>props和$emit</h3> <Children v-on:changeMsg="changeMsg"

  • 分享Vue子组件接收父组件传值的3种方式

    目录 1.简单声明接收 2.接收数据的同时进行 类型限制 3.接收数据的同时对 数据类型.必要性.默认值 进行限制 父组件代码↓ <template>     <div>         <div>父组件</div>         <Student :name="name" :age="age"></Student>     </div> </template> <

随机推荐