c# 学习笔记 (2) 窗体之间互相调用的方法

创建一个winform工程


创建两个窗体

一个子窗体,一个父窗体,这里为了演示,子窗体和父窗体上都有一个文本框和按键,点击任意一个窗体上的按键,窗体上文本框的内容会同步到另外一个窗体的文本框上。



添加控件textbox和button,然后双击button,添加按键单击事件,子窗体类似。

父窗体向子窗体传值

最常见的方法就是子窗体中创建一个public方法,在父窗体中调用该方法将参数传递给子窗体

子窗体中声明一个txbPrint方法,将接收到的str显示在子窗体文本框内

        public void txbPrint(string str){txbInfo.Text = str;}

父窗体

     FormChild formChild = new FormChild();private void FormMain_Load(object sender, EventArgs e){formChild.Show();}private void btnSend_Click(object sender, EventArgs e){formChild.txbPrint(txbInfo.Text);}

子窗体向父窗体传值

方法一 通过静态字段传值

  • 像上面父窗体向子窗体传值一样,子窗体也可以通过类似的方法向父窗体传值,不过一般不要这样用,会破坏代码封装性,别人看了会嫌弃的

在主窗体中添加一个静态字段,窗体加载时将this指针赋值给formMain,然后在子窗体中就可以通过静态字段formMain操作类中的public方法

 //主窗体public partial class FormMain : Form{public static FormMain formMain;public FormMain(){InitializeComponent();}FormChild formChild = new FormChild();private void FormMain_Load(object sender, EventArgs e){formMain = this;formChild.Show();}private void btnSend_Click(object sender, EventArgs e){formChild.txbPrint(txbInfo.Text);}}//子窗体public partial class FormChild : Form{public FormChild(){InitializeComponent();}public void txbPrint(string str){txbInfo.Text = str;}private void btnSend_Click(object sender, EventArgs e){//通过静态字段传值FormMain.formMain.txbPrint("txbInfo.Text");}}

方法二 通过委托传值

  • 个人感觉C# 中的委托和C语言中的指针函数有点类似。
  • 通过委托传值,首先声明一个委托类 本例子中 public delegate void SendLogDelegate(string str); 这个委托类可以生成 参数是string类型 没有返回值的委托,和C语言中声明指针函数类似
  • 然后通过这个委托类在子窗体中实例化一个委托 public SendLogDelegate sendLogDelegate;
  • 最后在主窗体中,实例化子窗体时,给委托 sendLogDelegate 赋值 txbPrint
  • 然后在子窗体中使用该委托,就相当于调用了主窗体中的 txbPrint函数
 //主窗体public partial class FormMain : Form{public FormMain(){InitializeComponent();}FormChild formChild = new FormChild();private void FormMain_Load(object sender, EventArgs e){//给委托赋值 调用该委托即调用 txbPrint方法formChild.sendLogDelegate = txbPrint;formChild.Show();}private void btnSend_Click(object sender, EventArgs e){formChild.txbPrint(txbInfo.Text);}public void txbPrint(string str){txbInfo.Text = str;}}//创建一个委托类 这个委托类可以 生成参数是string类型 没有返回值的委托public delegate void SendLogDelegate(string str);//子窗体public partial class FormChild : Form{//实例化一个委托 public SendLogDelegate sendLogDelegate;public FormChild(){InitializeComponent();}public void txbPrint(string str){txbInfo.Text = str;}private void btnSend_Click(object sender, EventArgs e){if(sendLogDelegate != null){//调用委托 sendLogDelegate(txbInfo.Text);}}}

方法三 传递简单参数

  • 一些情况下,主窗体仅需要获取子窗体关闭后的一些简单状态,如true或者false,这里可以使用窗体中的自带的字段来解决 this.DialogResult ,这个一般用在关闭子窗体时,修改子窗体的 this.DialogResult ,然后在主窗体中检查子窗体的 DialogResult 来传递参数,用的不多。

c# 学习笔记 (2) 窗体之间互相调用的方法相关推荐

  1. python数据挖掘学习笔记】十四.Scipy调用curve_fit实现曲线拟合

    #2018-03-28 10:02:08 March Wednesday the 13 week, the 087 day SZ SSMR python数据挖掘学习笔记]十四.Scipy调用curve ...

  2. 子窗体与父窗体之间相互调用其方法的实现

    今天下午一直在研究子窗体与父窗体之间怎样实现方法调用,研究了整个下午也算有了一点小成,现在将自己积累的一点经验记录下来: 对于子窗体调用父窗体中的方法可以按如下的方法实现: 1.首先在父窗体中按如下方 ...

  3. 学习笔记--存储过程的创建和调用

    学习笔记–存储过程的创建和调用 定义 存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后在程序中就可以调用多次.如果某次操作需要执行多次SQL,使用存储过程比单纯SQL ...

  4. vue学习笔记之:为何data是一个方法

    vue学习笔记之:为何data是一个方法 在vue开发中,我们可以发现,data中的属性值是在function中return出来的.可为何data必须是一个函数呢?我们先看官方的解释: 当一个组件被定 ...

  5. 激光slam学习笔记——基于图优化的激光slam方法

    激光slam学习笔记--基于图优化的激光slam方法 1.slam基础 整体来说,在激光slam中,滤波器的误差要小于图优化的误差. 图优化通俗点说就是里程计计算的位姿与观测到的位姿之间会形成一个误差 ...

  6. Java学习笔记:创建线程的两种方法

    Java学习笔记:创建线程的两种方法 一.预备工作 1.创建Maven项目ThreadDemo 2.在pom.xml里添加依赖 二.继承Thread类创建子线程

  7. MIPS汇编语言学习笔记11:整数减法 (mult方法)

    任务:整数相乘,并输出打印. 代码: .dataintA: .word 5intB: .word 2 .textli $v0, 1lw $a1, intAlw $a2, intBmult $a1, $ ...

  8. C#学习笔记——MDI窗体(多文档界面)

    1.设置父窗体: 如果要将某个窗体设置为父窗体,只需将该窗体的IsMdiContainer属性设置为True即可. 2.设置子窗体: 通过设为某个窗体的MdiParent属性来确定该窗体是那个窗体的子 ...

  9. Mysql学习笔记--多表之间约束等详细记录

    sql 进阶学习笔记-多表(二) 笔记(一)内容回顾 Mysql学习笔记(基础)基础sql语句详细记录 ​ 数据库的创建 : create database 数据库的名 character set 字 ...

最新文章

  1. sysfs_create_dir_ns
  2. JDK11使用IDEA,配置JavaFX
  3. 计算机和网络知识,计算机和网络技术基础知识
  4. 【数据挖掘】贝叶斯分类 ( 贝叶斯分类器 | 贝叶斯推断 | 逆向概率 | 贝叶斯公式 | 贝叶斯公式推导 | 使用贝叶斯公式求逆向概率 )
  5. Java基础小常识-继承-(10)
  6. 2017 ACM/ICPC Asia Regional Xian Online 记录
  7. oracle的have,Does oracle have “auto number” data type [duplicate]
  8. JAVA中equals()方法的重要性
  9. Linux系统编程3:基础篇之详解Linux软件包管理器yum
  10. vue createApp(),mount(),生命周期钩子函数执行顺序
  11. cplex java_【CPLEX教程03】java调用cplex求解一个TSP问题模型
  12. cad隐藏图层命令快捷键_cad与天正局部隐藏对象大法
  13. 移动端预览PDF及转成图片保存
  14. 概率论————思维导图(上岸必备)(数字特征)
  15. javascript禁用Backspace退格键(结合自己实际应用中遇到的textarea中退格造成页面假死问题做了修改)
  16. 【人工智能项目】sg2im文字转图像
  17. 实用电脑软件安利,朋友们快来挖宝
  18. 基于ThinkPHP6+Layui后台开发框架
  19. Dynaper - Dynamic Wallpapers for mac(动态壁纸制作工具) v1.5激活版
  20. 计算机中流水线的应用,计算机中的流水线技术

热门文章

  1. MyBatis中的大于、小于、like等符号写法
  2. [国嵌攻略][080][无名管道通讯]
  3. 对齐内容验证码和图片
  4. 2008_12_24_星期三
  5. 小结spring和struts整合的三类方式
  6. webpack增量打包多页应用
  7. 《微信公众平台开发最佳实践》——第3章 基 础 接 口 3.1 接收用户消息
  8. 登录环境故障的原理及解决办法? -bash-4.1$ -bash-4.1$
  9. RSS - 简单方便的follow资讯
  10. vector容器与find算法