如何访问另一个窗体的窗体控件?
我有两个Form
类,其中一个有一个ListBox
。 我需要一个ListBox
的SelectedIndex
属性的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