总结窗体间传值的几种方法

要做到类似于这样的效果

第一种:更改子窗体控件属性为public

1、更改子窗体textbox的Modifiers属性为public

2、在主窗体中添加一个子窗体的属性

实例化一个子窗体修改他的textbox的text属性即可

public ChildFrm ChildFrm { get; set; }

        private void ParFrm_Load(object sender, EventArgs e)
        {
             ChildFrm child = new ChildFrm();
            ChildFrm = child;

            child.Show();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            ChildFrm.childTxt.Text = this.parTxt.Text;
        }

父窗体直接操作子窗体的一个属性,并不是很合适,至少应该将它封装为一个子窗体的方法,让别人调用,子窗体做验证之后再修改

(类似于别人让你去买一瓶酱油,你应该自己去买,而不是别人从你口袋里直接掏钱去买了)

改进一下,先将子窗体textbox空间的Modifiers属性为private

子窗体加入代码:

public void SetTextbox(string str)
        {
            this.childTxt.Text = str;    //可以做一些校验
        }

父窗体修改代码为:

public ChildFrm ChildFrm { get; set; }

        private void ParFrm_Load(object sender, EventArgs e)
        {
             ChildFrm child = new ChildFrm();
            ChildFrm = child;
            child.Show();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            ChildFrm.SetTextbox(this.parTxt.Text);   //调用了子窗体的方法
        }

这样能体现一些面向对象的思想

第二种:用委托,发布订阅模式,观察者模式

目前主窗体和子窗体直接耦合

现在希望子窗体个数不确定,中间子窗体可以添加也可以减少,主窗体代码都不受太大影响

就要先将窗体解耦

public Action<string> AfterMsgSend;   //定义一个无返回值的发送消息委托private void ParFrm_Load(object sender, EventArgs e)
        {
            ChildFrm frm = new ChildFrm();   //初始化子窗体
            AfterMsgSend += frm.SetTextbox;  //把子窗体的方法注册到主窗体中去

            frm.Show();
        }

        private void button1_Click(object sender, EventArgs e)  //不管有多少个子窗体,主窗体的button按钮中的代码都不需要修改
        {
            if (AfterMsgSend != null)   //判断有没有多播委托加入
            {
                AfterMsgSend(this.parTxt.Text);  //还是调用childFrm中的方法
            }
        }

第三种:用事件,更具有安全性

public event Action<string> AfterMsgChange;

        private void ParFrm_Load(object sender, EventArgs e)
        {
            ChildFrm frm = new ChildFrm();
            AfterMsgChange += frm.SetTextbox;

            frm.Show();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (AfterMsgChange!=null)
            {
                AfterMsgChange(parTxt.Text);
            }
        }

委托和事件的区别:

委托是一个类型,事件是委托类型的一个特殊实例,事件只能在当前类的内部触发执行

时间: 2024-10-29 03:18:56

总结窗体间传值的几种方法的相关文章

窗体间传值的几种方法

刚开始学Winform的同学基本上都会遇到窗体传值的问题,如何解决这个问题,其实就是需要解决你对窗体的一个理解. 一定要记住,窗体(Form),它是一个类(Class)!! namespace MyForm { public partial class Form1 : Form { public Form1() { InitializeComponent(); } } } Form1,前面的修饰都是跟类相关的,例如public partial class,还有Form1的构造方法等等,都是一个类

[HTML]页面间传值的五种方法

一.QueryString传值:1. 这是最简单的传值方式,但缺点是传的值会显示在浏览器的地址栏中且不能传递对象,只适用于传递简单的且安全性要求不高的整数值,例如: 2. 新建一个WEB项目,添加一个页面命名为Test1,在页面中添加一个Button命名为btnLogin,再添加两个TextBox分别命名为txtUserName和txtPassWord,添加Button的Click()事件: private void btnLogin_Click (object sender, System.E

asp.net页面间传值的五种方法

一.QueryString传值: 1. 这是最简单的传值方式,但缺点是传的值会显示在浏览器的地址栏中且不能传递对象,只适用于传递简单的且安全性要求不高的整数值,例: 新建一个WEB项目,添加一个页面命名为Test1,在页面中添加一个Button命名为btnLogin,再添加两个TextBox分别命名为tbxUserName和tbxPassWord,添加Buttond的Click()事件: private void btnLogin_Click (object sender, System.Eve

窗口间传值的几种方法

刚開始学Winform的同学基本上都会遇到窗口传值的问题,怎样解决问题,事实上就是须要解决你对窗口的一个理解. 一定要记住,窗口(Form),它是一个类(Class).! namespace MyForm { public partial class Form1 : Form { public Form1() { InitializeComponent(); } } } Form1,前面的修饰都是跟类相关的,比如public partial class.还有Form1的构造方法等等,都是一个类基

PHP页面间传值的几种方法

方法一:require_once //Page a: <?php $a = "hello"; ?> //Page b: <?php require_once "A.php"; echo $a." world!"; ?> 访问b.php会得到:hello world! 方法二:通过页面跳转时携带参数传值 //Page a: <?php $a = "world"; ?> <a href=&

asp.net页面间传值的几种方法

表单提交 传送页面代码 <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>表单提交</title> <script type="text/javascript" language="javascript"> function post() { forPost.action

.NET 页面间传值的几种方法

1. QueryString 这是最简单的传值方式,但缺点是传的值会显示在浏览器的地址栏中且不能传递对象,只适用于传递简单的且安全性要求不高的数值. 传递: location.href="WebForm2.aspx?name=" + yourName&&name2="+ yourName2; 接收: string name = Request.QueryString["name"]; 2. Form 传递: 根据表单内控件的name和val

C#窗体间传值方法总结

假设我们需要点击主窗体FMMain中的某一个按钮时打开子窗体FMChild并将某一个值传给子窗体FMChild,一般情况下,我们点击按钮显示子窗体FMChild的代码为: FMChild fmChild = new FMChild(); fmChild.ShowDialog(); fmChild.Dispose(); 如果我们需要将主窗体FMMain中的string strValueA的值传给FMChild,那么我们首先对strValueA进行如下处理: private string strVa

C# winform窗体间传值(使用委托或事件)

窗体间传值 今天得空,刚好看到网上好多人再找winform窗体间传值的问题,由于昨天项目的优化的感觉不错,就写了个C# winform窗体间传值的demo,希望能给需要的人的带来帮助: 工程的源代码地址:https://github.com/yes-or-no/WinFormTransValueDemoByDelOrEvent.git C#winform窗体间传值,三种方法示例,注释详细.使用方法:使用vs2013打开编译运行即可: 工程中总共介绍了三种方法:###方法1:通过保存对象的引用调用