none
怎样用模式窗体或非模式窗体控制父窗体中的ListBox显示? RRS feed

  • 问题

  • 步骤:1.新建一个WINDOWS窗体Form1,在其中加入按钮button1和ListBox改名为listBox1;
             2.项目中添加一个WINDOWS窗体Form2,其中添加按钮button2和文本框改名为textBox1;
             3.对button1双击添加事件:
                private void button1_Click(object sender, EventArgs e)
            {
                Form2 f2 = new Form2();
                f2.ShowDialog();
            }
             表示可以打开Form2这个模式窗体;
          4.在Form2中设置一个变量private ListBox listBox1;并重载构造函数(我想用构造函数传递listBox1的引用来控制listBox1的显示): public FrmCreateFolder(ListBox lst)
            {
                InitializeComponent();
                listBox1 = lst;
            }
         5.在双击Form2中的button2生成事件,在事件中添加如下代码:
                 private void button2_Click(object sender, EventArgs e)
                     {
                         listBox1.Items.Add(textBox1.Text);
                     }
    请问高手:我运行时正常,但是在文本框中输入字符串,点击button2时,显示不能引用,请问怎么用构造函数对Form1中的listBox1引用而使Form2的文本框textBox1控制Form1中的listBox1的显示?另外听说还有其他方法来控制,请不吝赐教,谢谢!
          
    2009年5月13日 15:44

答案

  • //From1
    //---------------------------------------
    
    private void button1_Click(object sender, EventArgs e)
    {
        Form2 f2 = new Form2(listBox1);
        f2.ShowDialog();
    }
    
    //From2 
    //---------------------------------------
    
    private ListBox fListBox;
    From2(ListBox fListBox):this()
    {
        this.fListBox = fListBox
    }
    
    private void button2_Click(object sender, EventArgs e)
    {
        this.fListBox.Items.Add(textBox1.Text);
    }


    知识改变命运,奋斗成就人生!
    2009年5月14日 1:03
    版主
  • 上面是通过构造函数的参数传递的Form1的listBox1,可以实现你的需求了!

    我在补充一下,还可以使用自定义的事件来实现:
    在Form2中自定义一个事件,把你要传递的字符串作为事件的参数。当button2的Click事件触发的时候就触发这个自定义的事件,把你要传递的字符串作为事件参数传过去,然后在form1中订阅这个自定义的事件,就可以通过事件参数获得传来的字符串了,然后添加到listBox1上,这是在Form1中的事件处理函数中,当然就可以访问listBox1了!
    当然,如果不喜欢事件的话,直接使用委托也可以!

    你可以试一下,如果还有疑问,我们可以继续交流啊!
    周雪峰
    2009年5月14日 2:44
    版主
  • 不用客气啊!
    我用注释帮你解释一下,希望对你有帮助啊!
    //Form1
    public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }

            private void button1_Click(object sender, EventArgs e)
            {
                Form2 f2 = new Form2();
                f2.eEvent += new Form2.DEventHandler(addTo);//这一句和下一句要是颠倒过来的话,就是先显示模式窗体了,对阻塞当前线程的执行,也就是没有办法执行下面一行订阅事件的代码了!
                f2.ShowDialog();
               
            }
            public void addTo(object source, CdEventArgs e)
            {
                listBox1.Items.Add(e.Text);
            }
        }
    //Form2
    public partial class Form2 : Form
        {
            public Form2()
            {
                InitializeComponent();
            }

            public delegate void DEventHandler(object sender, CdEventArgs e);
            public event DEventHandler eEvent;
            private void button2_Click(object sender, EventArgs e)//这里我没有明白你的意图啊?这里已经可以实现了啊!
             {                                                                                 
                CdEventArgs arg = new CdEventArgs(textBox2.Text);
                if (eEvent != null)
                {
                    eEvent(this, arg);
                }
            }
        }
        public class CdEventArgs : EventArgs//你另外添加一个新类的文件也可以,写在这里也可以!
        {
            public string text;
            public CdEventArgs(string t)
            {
                text = t;
            }
            public string Text
            {
                get { return text; }
            }
        }


    周雪峰
    2009年5月18日 13:06
    版主

全部回复

  • //From1
    //---------------------------------------
    
    private void button1_Click(object sender, EventArgs e)
    {
        Form2 f2 = new Form2(listBox1);
        f2.ShowDialog();
    }
    
    //From2 
    //---------------------------------------
    
    private ListBox fListBox;
    From2(ListBox fListBox):this()
    {
        this.fListBox = fListBox
    }
    
    private void button2_Click(object sender, EventArgs e)
    {
        this.fListBox.Items.Add(textBox1.Text);
    }


    知识改变命运,奋斗成就人生!
    2009年5月14日 1:03
    版主
  • 上面是通过构造函数的参数传递的Form1的listBox1,可以实现你的需求了!

    我在补充一下,还可以使用自定义的事件来实现:
    在Form2中自定义一个事件,把你要传递的字符串作为事件的参数。当button2的Click事件触发的时候就触发这个自定义的事件,把你要传递的字符串作为事件参数传过去,然后在form1中订阅这个自定义的事件,就可以通过事件参数获得传来的字符串了,然后添加到listBox1上,这是在Form1中的事件处理函数中,当然就可以访问listBox1了!
    当然,如果不喜欢事件的话,直接使用委托也可以!

    你可以试一下,如果还有疑问,我们可以继续交流啊!
    周雪峰
    2009年5月14日 2:44
    版主
  • 谢谢,终于明白了,请多指教
    2009年5月15日 6:23
  • 恩,谢谢,我现在还没搞清楚事件到底怎么用,我在看看,要是可以的话,能不能把用事件的方法写给我
    2009年5月15日 6:24
  • 你先了解一下自定义事件,然后就可以按我说的思路自己写了,还是自己研究比较有收获啊!
    遇到了问题大家在一起讨论!
    周雪峰
    2009年5月15日 10:30
    版主
  • 恩,你说的对,还是要自己研究,我两个月前看事件的例子一直看不懂,今天终于看懂了,我试着用事件来达到目的,晚一些给你代码,你看有没有需要改进的地方啊,谢谢
    2009年5月15日 15:54
  • 可以啊!很高兴和你交流啊!
    周雪峰
    2009年5月16日 4:28
    版主
  • 唉 ,我实在没办法了,用事件还是不能达到目的,我把思路写给你看看,麻烦你帮我看看到底问题出在哪里,再麻烦你写一下你的方法。
    在Form1中加入button1和listBox1,在Form2中加入button2和textBox2.
    按你的思路要传递textBox2中的字符串作为参数,就要建立一个继承EventArgs的类,我在Form2中的代码如下
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;

    namespace WindowsApplication3
    {
        public partial class Form2 : Form
        {
            public Form2()
            {
                InitializeComponent();
            }
            public class CdEventArgs : EventArgs
            {
                public string text;
                public CdEventArgs(string t)
                {
                    text = t;
                }
                public string Text
                {
                    get { return text; }
                }
            }
            public delegate void DEventHandler(object sender,CdEventArgs e);
            public event DEventHandler eEvent;
            private void button2_Click(object sender, EventArgs e)
            {
                CdEventArgs arg=new CdEventArgs(textBox2.Text);
                if (Event != null)
                {
                    eEvent(this, arg.Text);
                }
            }
        }
    }
    在Form1中的代码
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;

    namespace WindowsApplication3
    {
        public partial class Form1 : Form
        {      
            private void button1_Click(object sender, EventArgs e)
            {
                Form2 f2 = new Form2();
                f2.ShowDialog();
                f2.eEvent += new Form2.DEventHandler(addTo);
            }
            public void addTo(object source, CdEventArgs e)
            {
                listBox1.Items.Add(e.Text);
            }
        }
    }
    不能调试,显示是:“错误 1 找不到类型或命名空间名称“CdEventArgs”(是否缺少 using 指令或程序集引用?) ”
    我实在不知道怎么在Form1中调用Form2定义的CdEventArgs类了,还是我整个思路就有问题?请指教

    2009年5月16日 14:26
  • 你好!
         你把CdEventArgs定义成Form2的嵌套类了,Form1中无法直接引用了,你把CdEventArgs的定义放到Form2定义的外面,这样修改一下试试:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;

    namespace WindowsApplication3
    {       
            public class CdEventArgs : EventArgs
            {
                public string text;
                public CdEventArgs(string t)
                {
                    text = t;
                }
                public string Text
                {
                    get { return text; }
                }
            }
        public partial class Form2 : Form
        {
            public Form2()
            {
                InitializeComponent();
            }
          
            public delegate void DEventHandler(object sender,CdEventArgs e);
            public event DEventHandler eEvent;
            private void button2_Click(object sender, EventArgs e)
            {
                CdEventArgs arg=new CdEventArgs(textBox2.Text);
                if (Event != null)
                {
                    eEvent(this, arg.Text);
                }
            }
        }
    }
    周雪峰
    2009年5月16日 14:56
    版主
  • 我终于完成了,我把代码写出来给你看哈,我把疑问写在代码后,呵呵,再次谢谢你!!
    //Form1
    public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }

            private void button1_Click(object sender, EventArgs e)
            {
                Form2 f2 = new Form2();
                f2.eEvent += new Form2.DEventHandler(addTo);//这一句和下一句要是颠倒过来可以调试,但是达不到效果
                f2.ShowDialog();
               
            }
            public void addTo(object source, CdEventArgs e)
            {
                listBox1.Items.Add(e.Text);
            }
        }
    //Form2
    public partial class Form2 : Form
        {
            public Form2()
            {
                InitializeComponent();
            }

            public delegate void DEventHandler(object sender, CdEventArgs e);
            public event DEventHandler eEvent;
            private void button2_Click(object sender, EventArgs e)//你看还有没有一种方法----重写button2_Click事件,来
             {                                                                                  //达到效果,但是我不懂怎么重写。
                CdEventArgs arg = new CdEventArgs(textBox2.Text);
                if (eEvent != null)
                {
                    eEvent(this, arg);
                }
            }
        }
        public class CdEventArgs : EventArgs//这个类可不可以不写在这里,而在项目里添加一个类,保存这个类的信息
        {
            public string text;
            public CdEventArgs(string t)
            {
                text = t;
            }
            public string Text
            {
                get { return text; }
            }
        }

    2009年5月18日 12:09
  • 不用客气啊!
    我用注释帮你解释一下,希望对你有帮助啊!
    //Form1
    public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }

            private void button1_Click(object sender, EventArgs e)
            {
                Form2 f2 = new Form2();
                f2.eEvent += new Form2.DEventHandler(addTo);//这一句和下一句要是颠倒过来的话,就是先显示模式窗体了,对阻塞当前线程的执行,也就是没有办法执行下面一行订阅事件的代码了!
                f2.ShowDialog();
               
            }
            public void addTo(object source, CdEventArgs e)
            {
                listBox1.Items.Add(e.Text);
            }
        }
    //Form2
    public partial class Form2 : Form
        {
            public Form2()
            {
                InitializeComponent();
            }

            public delegate void DEventHandler(object sender, CdEventArgs e);
            public event DEventHandler eEvent;
            private void button2_Click(object sender, EventArgs e)//这里我没有明白你的意图啊?这里已经可以实现了啊!
             {                                                                                 
                CdEventArgs arg = new CdEventArgs(textBox2.Text);
                if (eEvent != null)
                {
                    eEvent(this, arg);
                }
            }
        }
        public class CdEventArgs : EventArgs//你另外添加一个新类的文件也可以,写在这里也可以!
        {
            public string text;
            public CdEventArgs(string t)
            {
                text = t;
            }
            public string Text
            {
                get { return text; }
            }
        }


    周雪峰
    2009年5月18日 13:06
    版主