none
请问如何将父窗口变量传递到子窗口? RRS feed

  • 问题

  • Form2 frm2 = new Form2();
                    frm2.ShowDialog();

    使用private string returnValue1;
            public string Value1
            {
                set { returnValue1 = value; }
                get { return returnValue1; }

    将子窗口变量传递到父窗口,请问怎么将父窗口变量传递到子窗口呢?


    chenzuhui
    2010年9月5日 4:40

答案

  • 你好

    明白了..原來我一直都mis-understood your issue
    看來你的Program 不是用MDI 的
    所以Stone Z  的解決方法會好一點

    你可以改變你的 程式碼如下
    在Form1 中
    private void timer1_Tick(object sender, EventArgs e)
            {
              
                    returnValue = "D:/123.bmp";
                    Form2 frm2 = new Form2();
                    frm2.ShowDialog();
            }

    改成

    private void timer1_Tick(object sender, EventArgs e)
            {
              
                    returnValue = "D:/123.bmp";
                    Form2 frm2 = new Form2(this);
                    frm2.ShowDialog();
            }


    public Form2(Form1 frm1 )
            {
                InitializeComponent();
            
                MessageBox.Show(frm1.Value);
                pictureBox1.ImageLocation = frm1.Value;
            }

    Please correct me if my concept is wrong
    Chi
    2010年9月5日 11:54
    版主

全部回复

  • 你好

    你可以在父窗口 裡建立一個像上面一樣的變數 例如:
    private string ParentReturnValue1;
            public string Value1
            {
                set { ParentReturnValue1= value; }
                get { return ParentReturnValue1; }

    在Form2 中 可以用這個程式碼
    MDIParent1 mdi = this.MdiParent; //假使MDIParent1是父窗口
    MessageBox.Show(mdi.Value1);

    Please correct me if my concept is wrong

     


    Chi
    2010年9月5日 6:39
    版主
  • 1.重写子窗体的构造函数,在new的时候传入变量。

    2.子窗体增加属性方法,在show之前在主窗体复制给子窗体。

    3.全局静态变量(不推荐)

    其他可能还有,1,2够用了。


    family as water
    2010年9月5日 6:41
  • 你好,按照你说的进行操作,出现  无法将类型“System.Windows.Forms.Form”隐式转换为“aa.Form1”。存在一个显式转换(是否缺少强制转换?),请问这种类型要怎么强制转换?
    chenzuhui
    2010年9月5日 10:20
  • Form1 mdi = (aa.Form1)this.MdiParent; 改成这样就没提示要强制转换了,新的问题又来了,程序在运行过程中 MessageBox.Show(mdi.Value); 这一句出现 未将对象引用设置到对象的实例。 我是个新手,不太懂,请问这要怎么处理?
    chenzuhui
    2010年9月5日 10:40
  • 你好

    假設你的 MDI Parent[主窗体] 名是 Form1

    而 子窗体是Form2

    你可以嘗試以下的Code

    Form1 mdi = (Form1) this.MdiParent; //假使Form1 是父窗口
    MessageBox.Show(mdi.Value1);

    應該是可以解決這個問題的

    Please correct me if my concept is wrong

     

     


    Chi
    2010年9月5日 11:17
    版主
  • 你好,还是出现同样的问题。我把代码复制上来了!!

    父窗体Form1

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;

    namespace aa
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }

                private string returnValue;
                public string Value
                {
                    set { returnValue = value;}
                    get { return returnValue; }
                }
           
            private void timer1_Tick(object sender, EventArgs e)
            {
               
                    returnValue = "D:/123.bmp";
                    Form2 frm2 = new Form2();
                    frm2.ShowDialog();
            }
        }
    }

    子窗体Form2

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;


    namespace aa
    {
        public partial class Form2 : Form
        {
            public Form2()
            {
                InitializeComponent();
                Form1 mdi = (Form1)this.MdiParent;
                MessageBox.Show(mdi.Value);
                pictureBox1.ImageLocation = mdi.Value;
            }

            private string returnValue1;
            public string Value1
            {
                set { returnValue1 = value; }
                get { return returnValue1; }
            }
            private void button1_Click(object sender, EventArgs e)
            {
                returnValue1 = textBox1.Text;
                Close();
            }
        }
    }


    chenzuhui
    2010年9月5日 11:38
  • 你好

    明白了..原來我一直都mis-understood your issue
    看來你的Program 不是用MDI 的
    所以Stone Z  的解決方法會好一點

    你可以改變你的 程式碼如下
    在Form1 中
    private void timer1_Tick(object sender, EventArgs e)
            {
              
                    returnValue = "D:/123.bmp";
                    Form2 frm2 = new Form2();
                    frm2.ShowDialog();
            }

    改成

    private void timer1_Tick(object sender, EventArgs e)
            {
              
                    returnValue = "D:/123.bmp";
                    Form2 frm2 = new Form2(this);
                    frm2.ShowDialog();
            }


    public Form2(Form1 frm1 )
            {
                InitializeComponent();
            
                MessageBox.Show(frm1.Value);
                pictureBox1.ImageLocation = frm1.Value;
            }

    Please correct me if my concept is wrong
    Chi
    2010年9月5日 11:54
    版主