实际上过去我也写过类似的主题,这里把各种方法总结一下,内容的确基础了一些,所以这篇文章是写给刚刚学习C#的同行们的,希望对大家有些帮助吧!很抱 歉,这篇文章没有诡异的bug来勾起大家的兴趣,但是下篇文章我会努力写些有趣的主题的!
在窗体间传递数据的方法比较多:
1,在子窗体中 自定义一个构造函数,参数类型是主窗体,当要显示子窗体的时候,就用这个构造函数来实例化子窗体,然后把this指针传进去,说起来太抽象了,我大概一写 大家应该就明白了:
   public class frmMain:Form
   {
        ...
        frmControl controlForm=new frmControl(this);
        controlForm.Show();
    }

public class frmControl:Form  //子窗体,用来控制主窗体的某些显示!
    {
         private frmMain mainForm;
         public frmControl(frmMain mainForm)
         {
              this.mainForm=mainForm;
          }
          private void button1_Click(object sender,EventArgs e)

{

frmMain.textBox1.Text=this.textBox1.Text;  //把子窗体的文本框值传递给主窗体的文本框!

}

}
//其他语言也有类似的问题,即便要传递父窗口的指针(或者句柄等类似物)也要尽量传递的普遍的基础类,(能完成功能即可)

//不过C#中对所有的类的直接可见,省去了相互包含的问题,不过使用这种方法改变了原有的代码——即必须增加一个带参数的构造函数,并使用

//补充,winform/usercontrol中已经自动包含了parent属性,也就是父窗口的“指针”,这个时候可以直接使用,不过当然这个仅仅是个form类型

//具体异同见有些多了 ,另文详述吧。

2,我个人感觉上面的方法不是很好,虽然实现起来很简单,只是想改变窗体的标题文本,就把整个主窗体的引用都传 递给子窗体,这样的方式不是很幽雅,我们用接口来改进上面的方法,这样可以限制暴露给子窗体的功能,降低窗体之间的耦合度:
   public interface IChangeTitle:
   {
        void ChangeTitle(string title);
    }
   public class frmMain:Form,IChangeTitle
   {
        ...
        frmControl controlForm=new frmControl(this);
        controlForm.Show();
        public void ChangeTitle(string title)
        {
             this.Text=title;
         }        
    }

public class frmControl:Form  //子窗体,用来控制主窗体的某些显示!
    {
         private IChangeTitle ichangeTitle;
         public frmControl(IChangeTitle ichangeTitle)
         {
              this.ichangeTitle=ichangeTitle;
          }
          private void button1_Click(object sender,EventArgs e)

{

ichangeTitle.ChangeTitle(this.textBox1.Text);  //通过接口来调用方法

}

}
//接口“本质”还是传递了指针,或者说基类指针,完成了最基本的功能即可

//某种程度上这个是比较好的解决办法,可以针对这个父窗口-子窗口创建接口,即便以后有改动,新的父窗口可以继承接口即可,或者只改接口即可
3,为了进一步降低窗体之间的耦合度,我们可以用委托来实现这个需求:
    public partial class ChildForm : Form
    {
        public delegate void TitleChangedHandler(string title);
        public TitleChangedEventHandler TitleChanged;
        public ChildForm()
        {
            InitializeComponent();
        }

private void btn_Ok_Click(object sender, EventArgs e)
        {            
            if (TitleChanged != null)
                TitleChanged("Test Title"); //委托调用
            
        }
    }
主 窗体给委托变量赋值就可以了:
    public partial class MainForm : Form
    {
        private ChildForm loginForm = new ChildForm();
        public MainForm()
        {
            InitializeComponent();
            loginForm.TitleChanged = new ChildForm.TitleChangedEventHandler(FormTitleChanged);
        }

protected void FormTitleChanged(string title)
        {
            this.Text = title;
        }

private void button1_Click(object sender, EventArgs e)
        {
            loginForm.Show();
        }
    }
//某种程度上的托管可以理解为函数指针的话,那这个也就是通过一个“公用函数指针变量”完成的,但函数的实现和指针的赋值都由父窗口完成也就是降低了耦合性
4,也可以在子窗体中定义一个自定义的事件,然后自定 义一个事件参数,用来传递你想传递的一些信息:
    public partial class ChildForm : Form
    {
        public class TitleChangedEventArgs : EventArgs //事件参数类
        {
            private string title = "";
            public string Title
            {
                get
                {
                    return title;
                }
                set
                {
                    title = value;
                }
            }
        }
        public delegate void TitleChangedEventHandler(object sender, TitleChangedEventArgs e);
        public event TitleChangedEventHandler TitleChanged;
        public ChildForm()
        {
            InitializeComponent();
        }

private void btn_Ok_Click(object sender, EventArgs e)
        {
            TitleChangedEventArgs e1=new TitleChangedEventArgs();
            e1.Title="Login sucessed";
            OnTitleChanged(e1);//触发事件
            
        }

protected virtual void OnTitleChanged(TitleChangedEventArgs e)   //触发事件的方法
        {
            if (TitleChanged != null)
                TitleChanged(this, e);
        }
    }

主窗体订阅这个事件就可以了:
    public partial class MainForm : Form
    {
        private ChildForm loginForm = new ChildForm();
        public MainForm()
        {
            InitializeComponent();
            loginForm.TitleChanged += new ChildForm.TitleChangedEventHandler(FormTitleChanged);
        }

protected void FormTitleChanged(object sender, ChildForm.TitleChangedEventArgs e)
        {
            this.Text = e.Title;
        }

private void button1_Click(object sender, EventArgs e)
        {
            loginForm.Show();
        }
    }
//参考了事件的执行顺序之后,其实还是一个函数指着形式的,如果想找一个等价的形容的话,那就是把函数指针的方式包装成的了Sendmessage调用,本质都是一样的。

//不过事件比托管在实现上复杂,在语法上却简单了,托管在第一次使用是需要用=进行赋值操作,而在以后需要用+=进行,否则会造成‘未赋值的托管’错误

//而事件则相对简单,只有‘+=’订阅事件、‘-=’取消订阅两种

//

//另注:以上方法均不涉及到异步的问题,也就是说无论哪种方法,均可以“解释”成在该处直接调用响应函数,并且在等待响应完成之后再退出。

//

//后记:

转载于:https://www.cnblogs.com/kevinzhwl/archive/2010/06/12/1757241.html

WinForm 窗体之间交互的一些方法-兼托管事件相关推荐

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

    c# 学习笔记 (2) 窗体之间互相调用的方法 创建一个winform工程 创建两个窗体 一个子窗体,一个父窗体,这里为了演示,子窗体和父窗体上都有一个文本框和按键,点击任意一个窗体上的按键,窗体上文 ...

  2. C#使用事件方式Winform窗体之间传值

    [摘自:http://www.cnblogs.com/codeToUp/p/5371062.html] 工程的源代码地址:https://github.com/yes-or-no/WinFormTra ...

  3. 窗体之间传值的暴力方法

    窗体之间传值可以使用观察者模式,但是如果设置一个static(静态)变量,好像更简单.对于小型程序感觉是可用的: 在前一个窗体上: public static string x: //试验窗体切换的代 ...

  4. WinForm窗体之间传值

    当程序需要将一个窗体中的一些信息传给另一个窗体并让其使用时,就需要用到这个知识点 方法一:通过接受参数的窗体的构造函数传值 例:现有Form1和Form2两个窗体,二者都包含一个文本框,Form1还包 ...

  5. [代码]--WinForm 窗体之间相互嵌套

    public FrmScan() {InitializeComponent();Form1 frm = new Form1();frm.Dock = DockStyle.Fill;frm.FormBo ...

  6. 【转】WinForm窗体间数据交互的方法

    在窗体间传递数据的方法比较多: 1.在子窗体中自定义一个构造函数,参数类型是主窗体,当要显示子窗体的时候,就用这个构造函数来实例化子窗体,然后把this指针传进去,说起来太抽象了,我大概一写大家应该就 ...

  7. winformbutton边框怎么改_C# WinForm窗体控件Panel修改边框颜色以及边框宽度方法

    C# WinForm窗体控件Panel修改边框颜色以及边框宽度方法 1.新建组件这里可以自定义一个Panel控件起名为PanelEx 2.增加一个BoderColor属性和BoderSize属性 pr ...

  8. iframe和父窗体之间的互相监听方法

    例如:一个父窗体点击了个提交表单事件,同时要将提交的服务器返回处理结果显示在父窗体的iframe页面中,父窗体通过获得iframe中返回的结果来处理父窗体的部分数据.此时就要监听iframe的内容变更 ...

  9. 如何在窗体之间通讯的几种方法 ? VB.NET方案

    在面向过程的程序中,我们可以通过窗体名来访问其他窗体中控件或者数据,但是在面向过程中却稍有不同,面向过程显示了它的优点. 假设一个Window解决方案中,有两个窗体Form1和Form2,Form1窗 ...

最新文章

  1. 哪家中国公司为Java 16贡献最多?Java第一大厂居然不是第一的...
  2. [物理学与PDEs]第4章习题3 一维理想反应流体力学方程组的数学结构
  3. Boost:符号symbols找到null的测试程序
  4. 北京某公司.NET面试题
  5. agv ti 毫米波雷达_华为将利用 5G 开发激光雷达和毫米波雷达 - 产业资讯 -AGV产业联盟官方网站 -新战略机器人网-工业、服务、AGV机器人产业资讯传播者...
  6. 论文浅尝 | 用对抗学习做知识表示(NAACL2018)
  7. shell 脚本中 while 只执行一次
  8. 回家了,写博文继续!
  9. PLSQL 11破解码
  10. 谷歌浏览器报错-应用程序正常初始化(0xc0000005)
  11. 支付微服务设计方案格式模板_开发微商城有哪些常见问题
  12. win10系统停止更新服务器,Win10系统关闭自动更新功能的三种最佳方法
  13. 客户端访问https时应无浏览器(含终端)安全警告信息;_(多图)老弟,你连HTTPS 原理都不懂,还给我讲“中间人攻击”,逗我吗......
  14. 从阴阳五行,四书五经到国学的理解
  15. vardict使用说明
  16. 阿丹学财报(2)- 资产负债表
  17. 关于大数据中的NOSQL
  18. 用python编写彩色螺旋线
  19. 企业邮箱还安全吗?搜狐员工全员损失惨重
  20. 【Vue】Vue浅析

热门文章

  1. 创建容器时[Warning] IPv4 forwarding is disabled. Networking will not work.
  2. 单片机课程设计数字心率计_课程设计-基于单片机的数字人体心率计设计.doc
  3. python3.8新特性 逻辑表达式_python 3.8 新特性
  4. 【代码示例】 一个简单的Java死锁
  5. python(numpy,pandas4)——numpy中array合并和分割
  6. Matalab类定义
  7. 纸板箱机器人制作比例图纸_造一个黄油机器人(Butter Robot)
  8. ppt流程图字体太小_PPT演示让你尴尬的5大突发情况,早学早预防!
  9. java数据类型(整型、浮点型、char类型、boolean型、类型转换)
  10. 设计模式的理解:构造器模式(Builder Pattern)