如何访问另一个窗体的窗体控件?

我有两个Form类,其中一个有一个ListBox 。 我需要一个ListBoxSelectedIndex属性的setter,我想从第二个Form调用。

目前我正在做以下工作:

表格1

 public int MyListBoxSelectedIndex { set { lsbMyList.SelectedIndex = value; } } 

表格2

 private ControlForm mainForm; // form 1 public AddNewObjForm() { InitializeComponent(); mainForm = new ControlForm(); } public void SomeMethod() { mainForm.MyListBoxSelectedIndex = -1; } 

这是做这个最好的方法吗?

我通常使用单例devise模式,例如http://en.wikipedia.org/wiki/Singleton_pattern 。 我将创build应用程序在单例下运行的主窗体,然后创build访问器以访问我想在其他区域中触摸的窗体和控件。 其他forms则可以获得指向他们想要修改的控件的指针,或者获取他们希望修改的应用程序主要部分的数据。

另一种方法是在不同的表单上设置事件进行通信,并使用主窗体作为sorting的中心,将应用程序中的事件消息从一种表单传递到另一种表单。

让他们单身并不是一个完全不好的主意,但个人而言,我不喜欢这样做。 我宁愿把一个引用传给另一个表单。 这是一个例子。

Form1触发Form2打开。 Form2重载了构造函数,它将调用窗体作为参数,并提供对Form2成员的引用。 这解决了通信问题。 例如,我已经在Form1中公开了Form1中的Label属性,并在Form2中进行了修改。

用这种方法你可以用不同的方式进行交stream。

示例项目的下载链接

// 你的Form1

 public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Form2 frm = new Form2(this); frm.Show(); } public string LabelText { get { return Lbl.Text; } set { Lbl.Text = value; } } } 

// 你的Form2

 public partial class Form2 : Form { public Form2() { InitializeComponent(); } private Form1 mainForm = null; public Form2(Form callingForm) { mainForm = callingForm as Form1; InitializeComponent(); } private void Form2_Load(object sender, EventArgs e) { } private void button1_Click(object sender, EventArgs e) { this.mainForm.LabelText = txtMessage.Text; } } 

替代文字files/frm1.png

替代文字files/frm2.png

像这样访问表单控件(formname.controls [Index])可以根据需要强制转换控件types,例如:DataGridView dgv(DataGridView)form.Controls [Index];

它的容易,首先你访问其他表格这样可以说你的其他forms是Form2

在Form 1 Form2 F2 = new Form2(); foreach (Controls c in F2.Controls) if(c.Name=="TextBox1") c.TextBox1.Text = "hello from Form1"; Form2 F2 = new Form2(); foreach (Controls c in F2.Controls) if(c.Name=="TextBox1") c.TextBox1.Text = "hello from Form1";

多数民众赞成它,你只需从form1 form2中写入textbox1