现在有3个form,分别是form1、form2、form3,form1中有控件对象ListBox,在form2中执行了某些操作,我想在form1中的ListBox中显示相关信息,然后在form3中页执行了某些操作,同时也有相关信息需要在form1中的ListBox中显示出来。(在form3中不能通过new()方法来创建一个对象,因为创建后form2中显示的信息就没有了),求高人支招

解决方案 »

  1.   

    把form1传给form2,form3,然后当2,3执行了操作后,对应执行1的部分
      

  2.   

    实现方法很多很多,但是最好的方式是使用event
      

  3.   

    new 是创建新的实例,你需要做的是 把之前的实例传递过来然后操作就可以了
      

  4.   

    1.如果这三个窗体有一个共同的父窗体,可以new这三个窗体的时候记录下来 然后就可以访问到了
    2.如果没有这个共同的父窗体 最简单的就是传递参数了 把form1分别传给form2和form3  同时得设置form1的那个listbox是public的总之:lz的关键问题是在form2和form3中获得form1实体
      

  5.   

    将自动生成的控件对象改成 public static的时候,上面this.listBox 会报错的,我觉得改他们封装好的东西应该不是最佳的办法。
      

  6.   

    关于使用事件:
    1.在form2和form3中分别声明自己的委托和事件(当然是Public的)
    2.在form1中实例化form2和form3的时候,也定制它们的事件,触发的方法就是需要处理listbox的内容了
      

  7.   

    将每次构造form时,引用其它对象。对应的方法做好,使用时,通过对象直接调用对应对象的方法实现。不过不管是不是不用new,当你看得见时,说明那个窗体已经new出来了。只说在主方法那而不是加载方法。
      

  8.   

    这个还不简单, 就是 在FORM2中获取 FORM1 和FORM2的对象,方法多种  然后再通过FORM2调用FORM1 和FORM2对象 设置相关信息就行了!
      

  9.   

    最简单的就是重写构造函数了        /// <summary>
            /// 新构造
            /// </summary>
            /// <param name="f"></param>
            public Form2(Form1 f)
            {
                myForm1 = f;
                InitializeComponent();
            }
    在form1中  new form2时 Form2 form2=new Form2(this)
    关于form3同理这样实现并不符合现在的一些编程思想 lz慎用
      

  10.   

    擦  没贴完 public partial class Form2 : Form
        {
            private Form1 myForm1;
            public Form2()
            {
                InitializeComponent();
            }
            /// <summary>
            /// 新构造
            /// </summary>
            /// <param name="f"></param>
            public Form2(Form1 f)
            {
                myForm1 = f;
                InitializeComponent();
            }
    ……//其它代码  另 form1中的ListBox是public的
    }
      

  11.   

    主要问题是我form1是主界面,在main()入口的时候就new过了,哪位大神有没有类似的代码,借看!
      

  12.   

    http://topic.csdn.net/u/20110407/19/c1068d69-7331-4d02-bc0b-f5ba7a5f8dd8.html
      

  13.   

    from3用from1类变量写构造函数,通过委托事件来实现。
      

  14.   

    用事件或回调函数都可以实现,当然还有其他的方法,下面举个用事件实现的,仅供参考:   public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }        private void Form1_Load(object sender, EventArgs e)
            {
                Form2.OutputLogEvent += new OutputLogEventHandler(OnOutputLog);
                Form3.OutputLogEvent += new OutputLogEventHandler(OnOutputLog);            Form fm = new Form2();
                fm.Show();            fm = new Form3();
                fm.Show();
            }        private void OnOutputLog(string msg)
            {
                this.listBox1.Items.Add(msg);
            }
        }
        public delegate void OutputLogEventHandler(string msg);    public partial class Form2 : Form
        {
            public Form2()
            {
                InitializeComponent();
            }        public static event OutputLogEventHandler OutputLogEvent;        private void OutputMsg(string msg)
            {
                if (OutputLogEvent != null)
                    OutputLogEvent(msg);
            }        private void button1_Click(object sender, EventArgs e)
            {
                OutputMsg(this.textBox1.Text);
            } 
        }    public partial class Form3 : Form
        {
            public Form3()
            {
                InitializeComponent();
            }        public static event OutputLogEventHandler OutputLogEvent;        private void OutputMsg(string msg)
            {
                if (OutputLogEvent != null)
                    OutputLogEvent(msg);
            }        private void button1_Click(object sender, EventArgs e)
            {
                OutputMsg(this.textBox1.Text);        }
        }
      

  15.   

    Form1和Form2中使用的OutputLogEvent是静态事件,应该能满足楼猪的要求
      

  16.   


                Form fm = new Form2();
                fm.Show();            fm = new Form3();
                fm.Show();上面这段加载Form2和Form3的代码仅仅是为了测试时一次性加载它们,实际项目中Form2和Form3是不需要非要在那里加载的.
      

  17.   

    关于使用事件:
    1.在form2和form3中分别声明自己的委托和事件(当然是Public的)
    2.在form1中实例化form2和form3的时候,也定制它们的事件,触发的方法就是需要处理listbox的内容了
    关于使用事件:
    1.在form2和form3中分别声明自己的委托和事件(当然是Public的)
    2.在form1中实例化form2和form3的时候,也定制它们的事件,触发的方法就是需要处理listbox的内容了
      

  18.   

    是不是想在form2、form3中访问到form1中ListBox控件?可以这样:
    方法1:将form1.Designer.cs中的ListBox设置public,控件其实就是类的成员字段,然后在form2中用
    Form1 form1=Application.Forms["form1"];
    用form1.listBox1对其操作。方法2:无需将ListBox设置public,在form2中用
    ListBox listBox1=Application.Forms["form1"].Controls["listBox1"];
    前提是listBox1在窗体控件的顶层,然后用listBox1对其操作。
    如果不在窗体控件的顶层,可以写成
    ListBox listBox1=Application.Forms["form1"].Controls.Find("listBox1",true)[0];
    然后用listBox1对其操作。
      

  19.   

    更正一下,方法2中的两句代码需要类型转换下:
    ListBox listBox1=Application.Forms["form1"].Controls["listBox1"] as ListBox;
    ListBox listBox1=Application.Forms["form1"].Controls.Find("listBox1",true)[0] as ListBox;
      

  20.   

    方法1也要类型转换下:
    Form1 form1=Application.Forms["form1"] as Form1;
      

  21.   

    来个更简单通用的:    public delegate void OutputLogEventHandler(string msg);    public class LogHelper
        {
            public static event OutputLogEventHandler OutputLogEvent;        public static void OutputLog(string msg)
            {
                if (OutputLogEvent != null)
                    OutputLogEvent(msg);
            }    }   public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }        private void Form1_Load(object sender, EventArgs e)
            {
                LogHelper.OutputLogEvent += new OutputLogEventHandler(OnOutputLog);            Form fm = new Form2();
                fm.Show();            fm = new Form3();
                fm.Show();
            }        private void OnOutputLog(string msg)
            {
                this.listBox1.Items.Add(msg);
            }
        }    public partial class Form2 : Form
        {
            public Form2()
            {
                InitializeComponent();
            }        private void button1_Click(object sender, EventArgs e)
            {
                LogHelper.OutputLog(this.textBox1.Text);
            } 
        }    public partial class Form3 : Form
        {
            public Form3()
            {
                InitializeComponent();
            }        private void button1_Click(object sender, EventArgs e)
            {
                LogHelper.OutputLog(this.textBox1.Text);
            }
        }这个例子使用了一个独立的LogHelper类,可以消除Form之间的耦合,通用性更强点,可以在任何窗体中调用
      

  22.   

    方法3:定义一个全局listbox变量,所有form都是通过访问这个listbox得到数据,修改也同样道理。
      

  23.   

    使用委托与事件回传,具体例子看http://www.marblelog.com/index.php/archives/1713.html