老题新理解-在话winform之间的窗体传值
也许当你看到标题的时候,你会想,这窗体间传值方法就这么多,无非就是那几种:
1.静态变量(这个最简单)
非时性的传递:
1.窗体的属性
2.构造函数
时时性的传递:
1.委托
2.静态变量(这个最简单)
几乎很多人都可以很根据简单方便的原则选用静态变量的方式。如果少量的数据传送,完全没有问题,但是数据量大,效率的时候,个人觉得使用委托应该是最有效的。
我将记录我第一次接触窗体传值的时候过程:
窗体与窗体之间,就好比两栋房子,将房子一的信息传入到房子二,那就必须有一个跑腿的。(变量)
一,那这个变量可以做为一个共用变量,大家都可以使用,需要改变的时候直接赋值就可以了。
那很简单呀:
public static string commonvalue;
二,如果我只需要将提示他传值呢?(不规定特定变量)使用委托的方式 (上网查询后了解的)
子窗体:textC 一个textbox
代码:
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 FormPost {public partial class textC : Form{public textC(){InitializeComponent();}//为textC声明一个公有字段(也可以封装成属性)public DelChangetext changetxt;private void textBox1_TextChanged(object sender, EventArgs e){ //判断委托变量是否为空if (changetxt!=null){ //调用方法changetxt(this.textBox1.Text);}}} //委托类public delegate void DelChangetext(string txt);}
父窗体:textF 一个button 一个textbox
代码:
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 FormPost {public partial class textF : Form{public textF(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){textC child = new textC(); //为子窗体的字段赋值上值child.changetxt = new DelChangetext(txt => this.textBox1.Text = txt);child.Show();}} }
至于和利用属性传值和构造函数传值基本上都是同一个道理。
这里,窗体间的传值都是一个意思,关键是直接传递改变的值(静态变量),还是传递的一个命令(方法),还有csdn上的大神的方法,更好,下面我贴上代码 :
为了实现这个例子,你需要准备2个窗口,一个叫MainForm,上面至少需要一个richTextBox,两个工具栏按钮。
另一个叫 MyDialog 的子窗口,上面有一个 textBox1,一个 Button,作为确定按钮。
两个工具栏按钮分别实现两种形式的窗体调用,模态的和非模态的。
模态的意思是,我们打开对话框,将值传进取,操作完成确定,主窗体再获得对话框的值。
非模态的意思是,我们打开对话框,可以在不关闭窗口的情况下和主窗体交互,主窗体可以即时获得子窗体的值。类似记事本的查找替换对话框。
下面是代码:
主窗体:
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 WindowsFormsApplication1
{public partial class MainForm : Form{public MainForm(){InitializeComponent();}private MyDialog m_dlg;private void toolStripButton1_Click(object sender, EventArgs e){MyDialog dlg = new MyDialog(richTextBox1.Text);if (dlg.ShowDialog() == DialogResult.OK){richTextBox1.Text = dlg.TextBoxValue;}}private void toolStripButton2_Click(object sender, EventArgs e){if (m_dlg == null){m_dlg = new MyDialog(richTextBox1.Text);m_dlg.TextBoxChanged += new EventHandler((sender1, e1) =>{ richTextBox1.Text = m_dlg.TextBoxValue; });m_dlg.FormClosed += new FormClosedEventHandler((sender2, e2) => { m_dlg = null; });m_dlg.Show(this);}else{m_dlg.Activate();}}}
}
子窗体:
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 WindowsFormsApplication1
{public partial class MyDialog : Form{public event EventHandler TextBoxChanged;public string TextBoxValue {get { return textBox1.Text; }set { textBox1.Text = value; } }public MyDialog() : this("") { }public MyDialog(string Param){InitializeComponent();TextBoxValue = Param;}private void textBox1_TextChanged(object sender, EventArgs e){if (TextBoxChanged != null)TextBoxChanged(this, e);}private void button1_Click(object sender, EventArgs e){Close();}}
}
解释与说明:
模态传值的方法是:传入时可以使用构造函数,传出的时候首先判断是否用户是通过确定关闭的,如果是,那么用属性传出。
这个做法也是框架库的做法,比如打开文件对话框。
非模态的情况略微复杂:因为我们需要主窗体能和子窗体实时交互,为了同步主窗体和子窗体的数据,我们用了事件。有人问了,为什么我们不能让子窗体直接操作主窗体,这是因为考虑到对话框可以被重用,如果让它直接操作主窗口那么就限制死了这个子窗口只能被某个特定的主窗口调用。为了解除子窗体对调用者的耦合,我们使用事件。如果子窗体已经被显示,主窗体再次调用子窗体,那么通常我们希望激活子窗体而不是再显示一个。具体的实现参考代码。
完整的代码在此:http://download.csdn.net/source/3169257。编译运行这个代码需要 .NET Framework 4.0。
有任何问题可以提问。代码有问题,或者更好的办法,也欢迎批评。
个人总结:
关键还是如何思考问题和如何正确的描述问题
转载于:https://www.cnblogs.com/codefish/archive/2012/12/30/2839946.html
老题新理解-在话winform之间的窗体传值相关推荐
- 华为OD机试(21-40)老题库解析Java源码系列连载ing
华为OD机试算法题新老题库练习及源码 老题库 21.字符串序列判定 22.最长的指定瑕疵度的元音子串 23.处理器问题 24.单向链表中间节点 25.字符串重新排列.字符串重新排序 26.完美走位 2 ...
- CFS调度器的思想的新理解
本文通过详细分析老的调度器来说明cfs的优势.总是新理解新理解的,我怎么这么没完没了啊,其实每隔一段时间我都会在工作之余再读一读linux内核源代码的关键部分,每次读都有新的理解,然后就第一时间将心得 ...
- 老文新读 | 大数据于国内影视行业的意义及应用
编者注:本文由作者4年前发表于知乎专栏,前两天编者偶然读到,觉得很有意思,于是转过来与大家分享.原文标题:评析:触不到的大数据 作者 | 王义之,凡影合伙人 最近这几年,我们可以听到很多关于大数据在影 ...
- 计算机学院教师老带新总结,教师以老带新个人工作总结范文(精选3篇)
教师以老带新个人工作总结范文(精选3篇) 充实的工作生活一不留神就过去了,回想起这段时间的工作,一定取得了很多的成绩,好好地做个梳理并写一份工作总结吧.那么问题来了,工作总结应该怎么写?以下是小编为大 ...
- 计算机学院教师老带新总结,教师老带新新教师总结报告
教师专业发展是教师成长的重要内容和途径,关于教师专业发展的研究已成为一种显学.然而,在实际的教学要求.教师专业发展和教师专业发展的研究中今天学习啦小编给大家整理了教师老带新新教师总结,希望对大家有所帮 ...
- 计算机学院教师老带新总结,教师以老带新个人工作总结三篇
教师以老带新个人工作总结三篇 教师专业发展是教师成长的重要内容和途径,下面是小编收集的教师以老带新个人工作总结,欢迎阅读. 教师以老带新个人工作总结1 20xx年8月来到滨海学院从教,转眼一个学期结束 ...
- 深入理解 sudo 与 su 之间的区别
深入理解 sudo 与 su 之间的区别 作者: Himanshu Arora 译者: LCTT zhb127 在早前的一篇文章中,我们深入讨论了 sudo 命令的相关内容.同时,在该文章的末尾有提到 ...
- 理解 CI 和 CD 之间的区别(翻译)
博客搬迁至https://blog.wangjiegulu.com RSS订阅:https://blog.wangjiegulu.com/feed.xml 原文链接:https://blog.wang ...
- 深入理解 sudo 与 su 之间的区别【转】
深入理解 sudo 与 su 之间的区别 两个命令的最大区别是: sudo 命令需要输入当前用户的密码,su 命令需要输入 root 用户的密码.另外一个区别是其默认行为.sudo 命令只允许使用提升 ...
最新文章
- oracle 被另一个用户锁定
- 学习笔记:AC自动机
- jsp内置对象--session
- UNIX 环境高级编程(四)—— dirent.h
- Linux shell__文件操作
- 线性不可分的线性支持向量机的原始问题(凸二次规划)详细求解
- imagecopyresampled要生成彩色却生成了灰色图片
- android刷机工具mac版,刷机精灵mac版
- python画卡通兔子_卡通兔子的建模教程(完成整个图形曲面的创建)
- 【历史上的今天】10 月 23 日:ipod 问世;谷歌推出 CSE 搜索服务;人机交互领域先驱诞生
- CUDA和TensorRT入门
- Java面向对象之类和封装
- JavaPOI导出Excel合集——Java导出全内容
- 宝塔面板网页访问不了
- ppt中只有声音没有图像处理
- 河北省工资系统 服务器错误,河北省机关事业单位工资管理系统
- docker save与docker export的区别
- MySQL备份系列--备份方案总结性梳理
- CNN中为什么普遍使用小卷积核
- 【Java】一次BugFix的思路