zoukankan      html  css  js  c++  java
  • 窗体间的传值

    窗体间的传值的几种方法:

    第一种方法:

    1,新建两个窗体,一个父窗体Parentfrm,一个是子窗体Childfrm,分别在两个窗体上都加入一个TextBox标签和一个Button标签,分别命名为txtMsg和btnSend。(最简单,但直接对子窗体的属性进行操作,这样不安全)。

    2,代码如下所示:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace 窗体间传值
    {
        public partial class Parentfrm : Form
        {
            public Childfrm Childfrm { get; set; }//给子窗体写一个属性
            public Parentfrm()
            {
                InitializeComponent();
            }
    
            private void Parentfrm_Load(object sender, EventArgs e)
            {
                Childfrm frm = new 窗体间传值.Childfrm();
                Childfrm = frm;//给子窗体的属性赋值
                frm.Show();
            }
    
            private void btnSendMsg_Click(object sender, EventArgs e)
            {
                Childfrm.txtMsg.Text = this.txtMsg.Text;//将子窗体的txtMsg的指示对象可见级别(modifiers)设置为Public
            }
        }
    }

    第二种方法:

    在子窗体中写一个方法,来给子窗体传递值。简单的面向对象的思路

    子窗体中的代码如下:

    namespace 窗体间传值
    {
        public partial class Childfrm : Form
        {
            public void ReceiveMsg(string txt)//写一个方法给textBox赋值
            {
                txtMsg.Text = txt;
            }
            public Childfrm()
            {
                InitializeComponent();
            }

    父窗体的代码如下:

    namespace 窗体间传值
    {
        public partial class Parentfrm : Form
        {
            public Childfrm Childfrm { get; set; }//给子窗体写一个属性
            public Parentfrm()
            {
                InitializeComponent();
            }
    
            private void Parentfrm_Load(object sender, EventArgs e)
            {
                Childfrm frm = new 窗体间传值.Childfrm();
                Childfrm = frm;//给子窗体的属性赋值
                frm.Show();
            }
    
            private void btnSendMsg_Click(object sender, EventArgs e)
            {
                //Childfrm.txtMsg.Text = this.txtMsg.Text;//将子窗体的txtMsg的指示对象可见级别(modifiers)设置为Public
                Childfrm.ReceiveMsg(this.txtMsg.Text);
            }
        }
    }

    第三种方法:

    前两种方法有很多看弊端,两个对象间是直接耦合的,如果删除某一个窗体,则就会出错,那么我们要实现两个窗体间的解耦。使用委托

    子窗体代码如下(子窗体代码和方法二一样):

    namespace 窗体间传值
    {
        public partial class Childfrm : Form
        {
            public void ReceiveMsg(string txt)//写一个方法给textBox赋值
            {
                txtMsg.Text = txt;
            }
            public Childfrm()
            {
                InitializeComponent();
            }
    
            private void Childfrm_Load(object sender, EventArgs e)
            {
    
            }
        }
    }

    父窗体代码如下:

    namespace 窗体间传值
    {
        public partial class Parentfrm : Form
        {
    
            public Action<string >AfterMsgSend { get; set; }//定义一个无返回值的委托 Action无返回值 Funck有返回值
           
            public Parentfrm()
            {
                InitializeComponent();
            }
    
            private void Parentfrm_Load(object sender, EventArgs e)
            {
                Childfrm frm = new 窗体间传值.Childfrm();
                //子窗体加载之前,关注主窗体的变化
                AfterMsgSend += frm.ReceiveMsg;
                frm.Show();
            }
    
            private void btnSendMsg_Click(object sender, EventArgs e)
            {
                #region 简单菜鸟级别的
                //Childfrm.txtMsg.Text = this.txtMsg.Text;//将子窗体的txtMsg的指示对象可见级别(modifiers)设置为Public
                // Childfrm.ReceiveMsg(this.txtMsg.Text);
                #endregion
                #region 用委托来做
                if (AfterMsgSend==null)
                {
                    return;
                }
                AfterMsgSend(this.txtMsg.Text);//将父窗体textbox中的内容传给委托
                #endregion
            }
        }
    }
  • 相关阅读:
    正则表达式匹配整数和小数
    解决任务计划程序未启动任务,因为相同任务的实例正在运行的问题
    ActiveMQ 消息持久化到数据库(Mysql、SQL Server、Oracle、DB2等)
    C# CLR20R3 程序终止的几种解决方案
    彻底消除wine中文乱码,QQ,kugoo等等....
    Fedora如何添加第三方软件源?
    [转]Fedora 下安装NVIDIA显卡驱动(使用后无法进入图形界面)
    向fedora添加rpmfusion源
    [转]Java 8 Optional类深度解析(null处理)
    [转载]深入理解Java 8 Lambda
  • 原文地址:https://www.cnblogs.com/xiaoyaohan/p/9679787.html
Copyright © 2011-2022 走看看