更正一下,方法2中的两句代码需要类型转换下: ListBox listBox1=Application.Forms["form1"].Controls["listBox1"] as ListBox; ListBox listBox1=Application.Forms["form1"].Controls.Find("listBox1",true)[0] as ListBox;
方法1也要类型转换下: Form1 form1=Application.Forms["form1"] as Form1;
来个更简单通用的: 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之间的耦合,通用性更强点,可以在任何窗体中调用
2.如果没有这个共同的父窗体 最简单的就是传递参数了 把form1分别传给form2和form3 同时得设置form1的那个listbox是public的总之:lz的关键问题是在form2和form3中获得form1实体
1.在form2和form3中分别声明自己的委托和事件(当然是Public的)
2.在form1中实例化form2和form3的时候,也定制它们的事件,触发的方法就是需要处理listbox的内容了
/// 新构造
/// </summary>
/// <param name="f"></param>
public Form2(Form1 f)
{
myForm1 = f;
InitializeComponent();
}
在form1中 new form2时 Form2 form2=new Form2(this)
关于form3同理这样实现并不符合现在的一些编程思想 lz慎用
{
private Form1 myForm1;
public Form2()
{
InitializeComponent();
}
/// <summary>
/// 新构造
/// </summary>
/// <param name="f"></param>
public Form2(Form1 f)
{
myForm1 = f;
InitializeComponent();
}
……//其它代码 另 form1中的ListBox是public的
}
{
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); }
}
Form fm = new Form2();
fm.Show(); fm = new Form3();
fm.Show();上面这段加载Form2和Form3的代码仅仅是为了测试时一次性加载它们,实际项目中Form2和Form3是不需要非要在那里加载的.
1.在form2和form3中分别声明自己的委托和事件(当然是Public的)
2.在form1中实例化form2和form3的时候,也定制它们的事件,触发的方法就是需要处理listbox的内容了
关于使用事件:
1.在form2和form3中分别声明自己的委托和事件(当然是Public的)
2.在form1中实例化form2和form3的时候,也定制它们的事件,触发的方法就是需要处理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对其操作。
ListBox listBox1=Application.Forms["form1"].Controls["listBox1"] as ListBox;
ListBox listBox1=Application.Forms["form1"].Controls.Find("listBox1",true)[0] as ListBox;
Form1 form1=Application.Forms["form1"] as Form1;
{
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之间的耦合,通用性更强点,可以在任何窗体中调用