WinForm窗体之间交互的一些方法[转]

news/2025/2/26 7:06:19

 

实际上过去我也写过类似的主题,这里把各种方法总结一下,内容的确基础了一些,所以这篇文章是写给刚刚学习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;  //把子窗体的文本框值传递给主窗体的文本框!

               }

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

转载于:https://www.cnblogs.com/linyijia/archive/2010/08/10/1796352.html


http://www.niftyadmin.cn/n/3089486.html

相关文章

Linux系统之临时和永久修改hostname主机名

1、临时修改主机名:$ sudo hostname 主机名修改只能临时有效,机器重启后会自动还原。 2、永久修改主机名:修改hostname文件(路径:/etc/hostname):$ sudo nano /etc/hostname把hostname文件里面所…

聊聊flink的SourceFunction

序 本文主要研究一下flink的SourceFunction 实例 // set up the execution environmentfinal StreamExecutionEnvironment env StreamExecutionEnvironment.getExecutionEnvironment();DataStreamSource<String> dataStreamSource env.addSource(new RandomWordSource(…

php只取数字,php如何实现只取数字的功能

php只取数字的实现方法&#xff1a;1、使用“preg_match”函数从字符串中提取数字出来&#xff1b;2、使用PHP内置的“in_array”方法将字符串中出现的数字都提取出来&#xff0c;并拼接在一起&#xff1b;3、使用“is_numeric”方法。php 从字符串中提取数字出来1、正则提取【…

c#编程指南(一) lambda表达式

“Lambda 表达式”是一个匿名函数&#xff0c;是C# 3.0引入的新特性。 Lambda 运算符 >&#xff0c;该运算符读为“goes to”。 下面的代码简单的演示了Lambda表达式的出现&#xff1a; 1 privatedelegatevoidPrintDelegate(strings);2 3 //c#1.0 new delegate instance4 Pr…

qcom wlan kernel 解读 WCNSS_qcom_cfg.ini 文件

CORE/HDD/src/wlan_hdd_main.c 模块初始化&#xff1a; static int __init hdd_module_init ( void) {return hdd_driver_init(); }static int hdd_driver_init( void) {VOS_STATUS status;v_CONTEXT_t pVosContext NULL;struct device *dev NULL;int ret_status 0; #ifdef …

PHP版的underscore,那些PHP开发者可能用得上的工具

那些 PHP 开发者可能用得上的工具&#xff0c;今天学技巧就给大家整理整理&#xff0c;希望对于php初学者来说还是老手&#xff0c;还是正在学习提升中的朋友们都有所帮助。都说php是最好的开发语言&#xff0c;我信&#xff0c;你们信吗&#xff1f;PHP 函数的 JavaScript 实现…

Google MapReduce 的读后感

简单介绍本人虽然不是计算机专业的学生&#xff0c;但是有一点编程基础&#xff0c;目前正在学习计算机知识&#xff0c;对大数据和人工智能还是比较感兴趣。马云在卸任时讲到&#xff1a;“很多人还没搞清楚什么是PC互联网&#xff0c;移动互联网来了&#xff0c;我们还没搞清…

HDOJ 2899 HDU 2899 Strange fuction ACM 2899 IN HDU

MiYu原创, 转帖请注明 : 转载自 ______________白白の屋题目地址: http://acm.hdu.edu.cn/showproblem.php?pid2899题目描述:Strange fuctionTime Limit: 2000/1000MS (Java/Others) Memory Limit: 32768/32768K (Java/Others)Total Submission(s): 95Accepted Sub…