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());
            }
        }


    源代码地址

    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
  • 相关阅读:
    tensorflow 2.0 学习 (十) 拟合与过拟合问题
    tensorflow 2.0 学习 (九) tensorboard可视化功能认识
    tensorflow 2.0 学习 (八) keras模块的认识
    tensorflow 2.0 学习 (七) 反向传播代码逐步实现
    tensorflow 2.0 学习 (六) Himmelblua函数求极值
    tensorflow 2.0 学习 (五)MPG全连接网络训练与测试
    arp协议简单介绍
    Pthread spinlock自旋锁
    线程和进程状态
    内核态(内核空间)和用户态(用户空间)的区别和联系·
  • 原文地址:https://www.cnblogs.com/QiuJL/p/4524209.html
Copyright © 2011-2022 走看看