• 跨窗体传值


    1、使用委托解决跨窗体传值

    传值的过程中使用的是同一个线程,当这两个窗体分别想做一些其他处理又有数据沟通的时候,采用多线程实现跨窗体传值

               Thread thread = new Thread(() => {
                    FormChild formChild = new FormChild();
                    formChild.delSendToOtherForm = new DelSetToOtherForm(SetToOtherForm);
                    formChild.ShowDialog();
                });

    当使用多线程时,需要注意的是FormChild窗体是另一个线程创建的,设置FormParent窗体的属性,使其不捕获其他线程调用引发的异常,但是这样做不安全,接下来采用判断调用控件的线程来自哪里 

    C# 模态窗体详细介绍

               //校验该控件创建的线程是否是当前线程,如果是则为false,反之true
                if (this.txtReceive.InvokeRequired)
                {
                    //调用委托
                    this.Invoke(delSetToOtherForm, txt);
                }
                else
                {
                    this.txtReceive.Text = txt;
                }

    这样就不用去设置是否去捕获异常

    1.属性实现

            public string txtTest { get; set; }
            private void Form2_Load( object sender, EventArgs e )
            {
                textBox1.Text = txtTest;
            }
    
                Form2 form = new Form2();
                form.txtTest = textBox1.Text;
                form.Show();

    2.委托实现

     public partial class FormChild : Form
        {
            public DelSetToOtherForm delSendToOtherForm;
            public FormChild()
            {
                InitializeComponent();
                //显示当前窗体所在线程的标识符
                this.Text +="当前线程所在标识符是:"+ Thread.CurrentThread.ManagedThreadId;
            }
    
            private void btnSend_Click(object sender, EventArgs e)
            {
                if (txtSend.Text == string.Empty)
                {
                    return;
                }
                else
                {
                    delSendToOtherForm(txtSend.Text);
                }
            }
        }
    
    
        public delegate void DelSetToOtherForm(string txt);
        public partial class FormParent : Form
        {
            public FormParent()
            {
                InitializeComponent();
            }
    
            private void FormParent_Load(object sender, EventArgs e)
            {
                //设置txtReceive的ReadOnly属性
                this.txtReceive.ReadOnly =true;
                //显示当前窗体所在的线程
                this.Text += "当前线程所在标识符是:" + Thread.CurrentThread.ManagedThreadId;
                //不捕获其他线程调用引发的异常-这样写是不安全的
                Control.CheckForIllegalCrossThreadCalls = false; ;
            }
            public void SetToOtherForm(string txt)
            {
                this.txtReceive.Text = txt;
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                Thread thread = new Thread(() => {
                    FormChild formChild = new FormChild();
                    formChild.delSendToOtherForm = new DelSetToOtherForm(SetToOtherForm);
                    formChild.ShowDialog();
                });
                thread.Start();
            }
            ///哪个线程创建了FormChild窗体,FormChild窗体归其控制
            ///最简单的方式就是允许其他线程来访问当前线程创建的控件(指的是继承自Control基类的实例)-FormChild窗体窗体

    3.使用invoke

    namespace 跨窗体传值_多线程实现Invoke
    {
        public delegate void DelSetToOtherForm(string txt);
        public partial class FormParent : Form
        {
            //声明一个委托
            private DelSetToOtherForm delSetToOtherForm;
            public FormParent()
            {
                InitializeComponent();
            }
    
            private void FormParent_Load(object sender, EventArgs e)
            {
                //显示当前窗体所在的标识符
                this.Text += "当前窗体的标识符是:" + Thread.CurrentThread.ManagedThreadId;
                //实例化该委托
                delSetToOtherForm = new DelSetToOtherForm(SetToOtherThread);
                //不捕获其他线程调用控件引发的异常
                //Control.CheckForIllegalCrossThreadCalls = false;
            }
            public void SetToOtherForm(string txt)
            {
                //校验该控件创建的线程是否是当前线程,如果是则为false,反之true
                if (this.txtReceive.InvokeRequired)
                {
                    //调用委托
                    this.Invoke(delSetToOtherForm, txt);
                }
                else
                {
                    this.txtReceive.Text = txt;
                }
            }
            public void SetToOtherThread(string txt)
            {
                this.txtReceive.Text = txt;
            }
    
            private void btnShow_Click(object sender, EventArgs e)
            {
                //FormChild formChild = new FormChild();
                //formChild.delSendToOtherForm = new DelSetToOtherForm(SetToOtherForm);
                //formChild.Show();
    
                Thread thread = new Thread(() =>
                {
                    FormChild formChild = new FormChild();
                    formChild.delSendToOtherForm = new DelSetToOtherForm(SetToOtherForm);
                    formChild.ShowDialog();
                });
                thread.Start();
            }
        }
    }
     public partial class FormChild : Form
        {
            public DelSetToOtherForm delSendToOtherForm;
            public FormChild()
            {
                InitializeComponent();
            }
    
            private void FormChild_Load(object sender, EventArgs e)
            {
                //显示当前窗体所在的标识符
                this.Text += "当前窗体的标识符是:" + Thread.CurrentThread.ManagedThreadId;
            }
    
            private void btnSend_Click(object sender, EventArgs e)
            {
                delSendToOtherForm(txtSend.Text);
            }
        }
    }
  • 相关阅读:
    2019-8-31-win10-uwp-使用-WinDbg-调试
    PHP simplexml_import_dom() 函数
    PHP asXML() 函数
    PHP registerXPathNamespace() 函数
    PHP getNamespaces() 函数
    PHP getName() 函数
    查看收集统计信息的时间间隔
    SPOJ DISQUERY LCA + 倍增
    洛谷P3958 奶酪 并查集
    洛谷P2678 跳石头
  • 原文地址:https://www.cnblogs.com/chenyongblog/p/3327103.html
Copyright © 2020-2023  润新知