zoukankan      html  css  js  c++  java
  • WinForm中一个窗体调用另一个窗体的控件和事件的方法(附带源码)

        先申明下,此文适合和我差不多的菜鸟学习,没有什么高深知识点,不想耽误老鸟们的宝贵时间,如果有什么专业术语不对的还请指正啊。

        最近进行WinCE的开发,第一次实际做C/S架构的项目,其中遇到很多问题。这个问题使我记忆深刻,当时在谷歌中搜索了好久都没找到想要的答案,用的就是文章标题中的原话。然后又换成“WinForm中子窗体调用父窗体的控件和事件的方法”,搜到的还是不太多。但我发现原来这个可以用委托与事件来解决(说来惭愧,后来问了一个同学,她说这个以前老师讲过,好吧,我承认上学时划水了哭)。

        假设现在我有一个主窗体Form1,现想在另外两个窗体Form2,Form3中运用不同的方法来实现:修改Form2,Form3中的numericUpDown的值时Form1中textbox值随之改变。

    先讲第一种方法,直接将整个窗体作为参数传给另一个窗体。

    这是Form1中的代码:

     public partial class Form1 : Form
        {
    
            public Form1()
            {
                InitializeComponent();
            }
    
            //第一种方法示例事件
            public void changetext(string s)
            {
                this.textBox1.Text = s;
            }
    
            //第一种方法
            private void button1_Click(object sender, EventArgs e)
            {
                //将整个窗体作为值传给Form2
                var frm2 = new Form2(this);
                frm2.ShowDialog();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
    
            }
    
       }

    这是Form2中代码:

    public partial class Form2 : Form
        {
            //这是第一种方法
            private Form1 f1;
            public Form2()
            {
                InitializeComponent();
            }
    
            public Form2(Form1 frm1)
            {
                InitializeComponent();
                f1 = frm1;//将传过来的Form1全部赋值给f1,这样就可以在这边调用Form1了
            }
    
            private void Form2_Load(object sender, EventArgs e)
            {
    
            }
    
            private void numericUpDown1_ValueChanged(object sender, EventArgs e)
            {
                //这是第一种方法
                //调用Form1中的changetext事件
                f1.changetext(numericUpDown1.Value.ToString());
            }
            
        }
    第二种方法,使用委托与事件(推荐)

    委托与事件的概念这里就不讲了,如果有兴趣,大家可以去看看张子阳的博客,博客地址

    Form1中代码:

    public partial class Form1 : Form
        {
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
    
            }
    
            //改变值的事件
            private void frm2_changed(string s)
            {
                //此处是给原有窗体中控件赋值
                this.textBox1.Text = s + s;
            }
    
            //清空值的事件
            private void frm3_empty(string s)
            {
                this.textBox1.Text = "";
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                var frm3 = new Form3();
                //这是委托与事件的第二步,
                //写到+=时,按两次Tab键会自动生成frm2_changed,frm3_empty两个事件
                frm3.changed += new Form3.Form2Handle(frm2_changed);//改变值的事件
                frm3.empty += new Form3.Form2Handle(frm3_empty);//清空值的事件
                frm3.ShowDialog();
            }
        }
    Form3中代码:

     public partial class Form3 : Form
        {
            //定义带参数的委托与两个事件
            //这是委托与事件的第一步
            public delegate void Form2Handle(string s);
            public event Form2Handle changed;
            public event Form2Handle empty;
    
            public Form3()
            {
                InitializeComponent();
            }
    
            private void Form3_Load(object sender, EventArgs e)
            {
    
            }
    
            private void numericUpDown1_ValueChanged(object sender, EventArgs e)
            {
                //这是委托与事件的第三步
                //传值
                changed(numericUpDown1.Value.ToString());
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                empty(numericUpDown1.Value.ToString());
            }
        }


    源代码地址

    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
  • 相关阅读:
    直接报错了:无法加载文件 C:UsersAdministratorAppDataRoaming pmvue.ps1,因为在此系统中禁止执行脚本
    [vue系列]-vue+vue-i18n+elementUI 国际化
    new vue 实例发生了什么呢?
    vue引用外部JS的两种方案
    web轻量级富文本框编辑
    Cannot read property '_withTask' of undefined
    element 动态合并表格
    前端如何获取原始图片大小
    ASP.Net Core使用Ajax局部更新
    ASP.NET Core中的jQuery Unobtrusive Ajax帮助器
  • 原文地址:https://www.cnblogs.com/QiuJL/p/4524209.html
Copyright © 2011-2022 走看看