C# 一个子窗体向父窗体传递参数的例子

一、编码思路

在父窗体使用Lambda表达式自定义事件赋给子窗体内定义的事件,通过在子窗体内调用事件实现传参

二、传递的参数

创建文件SomeUtility.cs,在类SomeUtility中声明结构ReturnStruct

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EventTest
{
    public class SomeUtility
    {
        public struct ReturnStruct
        {
            public string sData1;
            public string sData2;
            public string sData3;
            public ReturnStruct(string s1, string s2, string s3)
            {
                sData1 = s1;
                sData2 = s2;
                sData3 = s3;
            }
        }
    }
}

三、子窗体相关

窗体FormTip,里面有三个TextBox,单击确定会将三个TextBox的值传递到父窗体中

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 EventTest
{
    public partial class FormTip : Form
    {
        public class TEventArgs<T> : EventArgs
        {
            public T Args
            {
                get;
                private set;
            }

            public TEventArgs(T args)
            {
                this.Args = args;
            }
        }

        [Browsable(false)]
        internal event EventHandler<TEventArgs<SomeUtility.ReturnStruct>> EventTest;

        SomeUtility.ReturnStruct rs;
        public SomeUtility.ReturnStruct GetReturnStruct()
        {
            return rs;
        }

        //构造函数1:无参数
        public FormTip()
        {
            InitializeComponent();
        }

        //构造函数2:有一个ReturnStruct类型参数
        public FormTip(SomeUtility.ReturnStruct r)
        {
            InitializeComponent();
            this.rs.sData1 = r.sData1;
            this.rs.sData2 = r.sData2;
            this.rs.sData3 = r.sData3;
        }

        private void FormTip_Load(object sender, EventArgs e)
        {
            this.txtData1.Text = rs.sData1;
            this.txtData2.Text = rs.sData2;
            this.txtData3.Text = rs.sData3;
        }

        //单击“确定”按钮:调用事件EventTest
        private void btnOK_Click(object sender, EventArgs e)
        {
            //调用事件EventTest
            if (this.EventTest != null)
            {
                SomeUtility.ReturnStruct rs = new SomeUtility.ReturnStruct(
                    this.txtData1.Text, this.txtData2.Text, this.txtData3.Text);
                this.EventTest(this, new TEventArgs<SomeUtility.ReturnStruct>(rs));
            }
            //退出窗口
            this.Close();
        }

        //单击“取消”按钮:直接退出
        private void btnCancel_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}

四、父窗体相关

窗体FormMain,单击按钮btnTest打开子窗体,并在单击子窗体的“确定”按钮后根据子窗体内设置的值更新txtResult中的文本内容

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 EventTest
{
    public partial class FormMain : Form
    {
        public FormMain()
        {
            InitializeComponent();
        }

        private void FormMain_Load(object sender, EventArgs e)
        {
            this.txtResult.Text = "1:- 2:- 3:-";
        }

        private void btnTest_Click(object sender, EventArgs e)
        {
            SomeUtility.ReturnStruct rsTest = 
                new SomeUtility.ReturnStruct("Data1", "Data2", "Data3");
            FormTip frmTip = new FormTip(rsTest);

            frmTip.EventTest += (obj, args) =>
            {
                SomeUtility.ReturnStruct rsTemp = frmTip.GetReturnStruct();
                rsTest.sData1 = args.Args.sData1;
                rsTest.sData2 = args.Args.sData2;
                rsTest.sData3 = args.Args.sData3;
                this.txtResult.Text = string.Format("1:{0} 2:{1} 3:{2}",
                    rsTest.sData1, rsTest.sData2, rsTest.sData3);
                MessageBox.Show("赋值成功");
            };

            frmTip.ShowDialog();
        }
    }
}

五、运行示例

1)打开父窗体FormMain

2)打开子窗体FormTip,输入三个值

3)将三个值传回父窗体FormMain

END

时间: 2024-08-04 16:48:11

C# 一个子窗体向父窗体传递参数的例子的相关文章

子窗体、父窗体方法互调

var childWindow = $("#editFrame")[0].contentWindow;//获取子窗体的window对象. childWindow.subForm(); $("#editFrame")得到frame [0].contentWindow//frame的子窗体,将JQUERY对象转化为DOM对象 subForm();//字窗体定义的方法 ----------------------------------------------------

Winfrom子窗体刷新父窗体

本人比较懒,直接从网上转载了一篇比较合适的文章,只是文章格式有点乱,地址是 http://aspnet.blog.163.com/blog/static/17515510920121126104433237/ 调用窗体(父):Form1,被调用窗体(子):Form2 方法1:   所有权法//Form1://需要有一个公共的刷新方法public   void   Refresh_Method(){//...}//在调用Form2时,要把Form2的所有者设为Form1Form2   f2   =

MFC获得主窗体和父窗体指针

MFC编程中经常遇到子窗体向父窗体传递參数的情况,这就须要获得父窗体的指针. 例:主对话框CMyMainDlg通过buttonButtonA进入对话框CMyParentDlg.CMyParentDlg在通过buttonButtonB进入对话框CMyChildDlg.如今须要在CMyChildDlg分别訪问CMyParentDlg和CMyMainDlg的内容.须要在CMyChildDlg中增加下面两条语句: CMyMainDlg    *pMMD = (CMyMainDlg*)AfxGetMain

Winform子窗体刷新父窗体

调用窗体(父):Form1,被调用窗体(子):Form2方法1:   所有权法//Form1://需要有一个公共的刷新方法public   void   Refresh_Method(){//...}//在调用Form2时,要把Form2的所有者设为Form1Form2   f2   =   new   Form2()   ;f2.Owner   =   this;f2.ShowDialog()   ;//Form2://在需要对其调用者(父)刷新时Form1   f1   ;f1   =  

子窗体和父窗体双向传值——C#窗体传值方法总结

简介 在很多场景下,我们的程序需要完成窗体间的传值功能,有时候是父窗体→子窗体单向传值.子窗体→父窗体传值甚至是,也有时候我们需要父窗体?子窗体双向传值. 在本文中主要介绍一些能够实现双向传值的方法,能够双向传值的方法也能够实现单向传值. 本文的所有源码都可以在GitHub上下载. 本文介绍的方法仅限于我自己知道并且实现过的,我相信还有很多我并不知道的方法,因此也许在很多朋友眼中本文的内容是浅显甚至可笑的,希望路过的各方朋友不吝赐教,我也希望不断地进步! 方法1:Public字段+ShowDia

.Net子窗体给父窗体传值的几种方法

其实方法有很多种,这里只介绍3种,大家如有更好的方法可互相学习学习. 1.子父窗体Owner设定法: Form1: void Button_fm1_Click(object sender, EventArgs e) { Form2 fm2 = new Form2(); fm2.Owner = this;   //将Form2的Owner指针指向Form1 fm2.ShowDialog(); } Form2: void Button_fm2_Click(object sender, EventAr

C# MDI 子窗体被父窗体控件挡住

最近在做一个小工具,发现了一个过去做项目没有遇到的问题:子窗体被父窗体的控件给挡住了! 如下图所示: 子窗体的TopMost 已经设为true,父窗体的控件已经置于底层,但是结果还是很悲观!无奈之下,谷歌了一下,尝试了很多种方法,结果找到了一种最简单的解决问题方案,代码如下: using System.Runtime.InteropServices; // 导入名称空间 [DllImport("user32")] public static extern int SetParent(i

子窗体控制父窗体的内容

//父窗体 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 Fo

重构—子窗体和父窗体

用单例模式实现子窗体在父窗体中显示,得到如下效果: 代码如下: 在子窗体中写入单例模式 '当程序没有焦点的时候,最小化 Private Sub frmStatusUI_Deactivate(senderAs Object, e As EventArgs) Handles Me.Deactivate If Me.WindowState <>FormWindowState.Minimized Then Me.WindowState =FormWindowState.Minimized 'Me.ZO

WinForm 子窗体在父窗体范围内移动,不能出父窗体 摘自于网络

详细解释:1, 主窗体Form1属性IsMdiContainer设为True,并添加ToolStrip控件, Toolstrip中添加一个按钮toolStripButton1.         2,添加新窗体Form2.           3,主窗体Form1中toolStripButton1的Click事件           private void toolStripButton1_Click(object sender, EventArgs e)         {