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 WindowsFormsApplication1
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }        private MyDialog m_dlg;        private void toolStripButton1_Click(object sender, EventArgs e)
        {
            MyDialog dlg = new MyDialog(richTextBox1.Text);
            if (dlg.ShowDialog() == DialogResult.OK)
            {
                richTextBox1.Text = dlg.TextBoxValue;
            }
        }        private void toolStripButton2_Click(object sender, EventArgs e)
        {
            if (m_dlg == null)
            {
                m_dlg = new MyDialog(richTextBox1.Text);
                m_dlg.TextBoxChanged += new EventHandler(
                    (sender1, e1) =>
                    { richTextBox1.Text = m_dlg.TextBoxValue; }
                );
                m_dlg.FormClosed += new FormClosedEventHandler(
                    (sender2, e2) => { m_dlg = null; }
                );
                m_dlg.Show(this);
            }
            else
            {
                m_dlg.Activate();
            }
        }
    }
}
子窗体C# code 
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 WindowsFormsApplication1
{
    public partial class MyDialog : Form
    {
        public event EventHandler TextBoxChanged;        public string TextBoxValue 
        {
            get { return textBox1.Text; }
            set { textBox1.Text = value; } 
        }        public MyDialog() : this("") { }        public MyDialog(string Param)
        {
            InitializeComponent();
            TextBoxValue = Param;
        }        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            if (TextBoxChanged != null)
                TextBoxChanged(this, e);
        }        private void button1_Click(object sender, EventArgs e)
        {
            Close();
        }
    }
}这篇文章中,有个问题想问下,我按toolStripButton2_Click执行弹出m_dlg,可是当我关闭m_dlg的时候 m_dlg.TextBoxValue因为m_dlg为null,会报错,请教怎么解决

解决方案 »

  1.   

     m_dlg.FormClosed += new FormClosedEventHandler(
                        (sender2, e2) => { m_dlg = null; }这句话不是释放了吗,把它注释掉就好了。
      

  2.   


            private void toolStripButton1_Click(object sender, EventArgs e)
            {
                MyDialog dlg = new MyDialog(richTextBox1.Text);
                if (dlg.ShowDialog() == DialogResult.OK)
                {
                    richTextBox1.Text = dlg.TextBoxValue;
                }
            }        private void toolStripButton2_Click(object sender, EventArgs e)
            {
                    MyDialog m_dlg = new MyDialog(richTextBox1.Text);
                    m_dlg.TextBoxChanged += new EventHandler(
                        (sender1, e1) =>
                        { richTextBox1.Text = m_dlg.TextBoxValue; }
                    );
                      m_dlg.Show(this);
             }你这样不就行了吗,
      

  3.   

    你这样不行,当我窗口下次再开启的时候,似乎很多以前new的都被释放了,只是窗口没有释放
      

  4.   

    不好意思,说错,如果你下次再开启的时候,似乎之前的
     m_dlg.TextBoxChanged += new EventHandler(
      (sender1, e1) =>
      { richTextBox1.Text = m_dlg.TextBoxValue; }这样的事件添加就无效了
      

  5.   

            //private MyDialog m_dlg;        private void button1_Click(object sender, EventArgs e)
            {
                MyDialog dlg = new MyDialog(richTextBox1.Text);
                if (dlg.ShowDialog() == DialogResult.OK)
                {
                    richTextBox1.Text = dlg.TextBoxValue;
                }
            }        private void button2_Click(object sender, EventArgs e)
            {
                //if (m_dlg == null)
                {
                    MyDialog m_dlg = new MyDialog(richTextBox1.Text);
                    m_dlg.TextBoxChanged += new EventHandler(
                        (sender1, e1) =>
                        { richTextBox1.Text = m_dlg.TextBoxValue; }
                    );
                    //m_dlg.FormClosed += new FormClosedEventHandler(
                    //    (sender2, e2) => { m_dlg = null; }
                    //);
                    m_dlg.Show(this);
                }
                //else
                //{
                //    m_dlg.Activate();
                //}
            }这样好用啊,你怎么不行呢?
      

  6.   

    我今天又试验了一下,那个代码的toolStripButton2_Click弹出的窗口我进行了改动。
    MainForm.isMdiContainer = true;     private void toolStripButton2_Click(object sender, EventArgs e)
            {
                if (m_dlg == null)
                {
                    m_dlg = new MyDialog(richTextBox1.Text);
                    m_dlg.TextBoxChanged += new EventHandler(
                        (sender1, e1) =>
                        { richTextBox1.Text = m_dlg.TextBoxValue; }
                    );
                    m_dlg.FormClosed += new FormClosedEventHandler(
                        (sender2, e2) => { m_dlg = null; }
                    );                m_dlg.MdiParent = this;                m_dlg.Show();
                }
                else
                {
                    m_dlg.Activate();
                }
            }
    这样就失效了,弹不出来,难道这种传值方式不适用MDI方式?
      

  7.   

    up,up,麻烦大家帮我看下我16楼的回复 
      

  8.   

    private void toolStripButton2_Click(object sender, EventArgs e)
            {
                if (m_dlg == null)
                {
                    m_dlg = new MyDialog(richTextBox1.Text);
                    m_dlg.TextBoxChanged += new EventHandler(
                        (sender1, e1) =>
                        { richTextBox1.Text = m_dlg.TextBoxValue; }
                    );
                    m_dlg.FormClosed += new FormClosedEventHandler(
                        (sender2, e2) => { m_dlg = null; }
                    );
                    m_dlg.Show(this);
                }
                else
                {
                    m_dlg.Activate();
                }
            }没有出现问题,一切正常。private void toolStripButton2_Click(object sender, EventArgs e)
            {
                if (m_dlg == null)
                {
                    m_dlg = new MyDialog(richTextBox1.Text);
                    m_dlg.TextBoxChanged += new EventHandler(
                        (sender1, e1) =>
                        { richTextBox1.Text = m_dlg.TextBoxValue; }
                    );
                    m_dlg.FormClosed += new FormClosedEventHandler(
                        (sender2, e2) => { m_dlg = null; }
                    );                m_dlg.MdiParent = this;                m_dlg.Show();
                }
                else
                {
                    m_dlg.Activate();
                }
            }出现了错误
    在这一行:m_dlg.MdiParent = this;
    被指定为此窗体的 MdiParent 的窗体不是 MdiContainer。
    参数名: value不明白楼主为什么要改代码?
      

  9.   

    因为我设置的是MDI窗口啊,我不能点一个工具栏我就在xp下面的任务栏多一个窗口吧
      

  10.   


    MainForm.isMdiContainer = true;     private void toolStripButton2_Click(object sender, EventArgs e)
            {
                if (m_dlg == null)
                {
                    m_dlg = new MyDialog(richTextBox1.Text);
                    m_dlg.TextBoxChanged += new EventHandler(
                        (sender1, e1) =>
                        { richTextBox1.Text = m_dlg.TextBoxValue; }
                    );
                    m_dlg.FormClosed += new FormClosedEventHandler(
                        (sender2, e2) => { m_dlg = null; }
                    );                m_dlg.MdiParent = this;                m_dlg.Show();
                }
                else
                {
                    m_dlg.Activate();
                }
            }难道这种传值方式不适用MDI方式?
    困扰很久很久,请教解决方案