我有两个Form
个类,其中一个有ListBox
个。我需要SelectedIndex
ListBox
属性的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;
}
这是最好的方法吗?
答案 0 :(得分:22)
让他们成为单身人士并不是一个完全糟糕的主意,但我个人不喜欢这样做。我宁愿将一个引用传递给另一个表单。这是一个例子。
Form1触发Form2打开。 Form2重载了构造函数,它将调用form作为参数,并提供对Form2成员的引用。这解决了通信问题。例如,我在Form1中将Label Property公开为public,并在Form2中进行了修改。
通过这种方法,您可以以不同的方式进行沟通。
<强> Download Link for Sample Project 强>
// 您的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;
}
}
答案 1 :(得分:3)
我通常使用Singleton设计模式来实现这样的http://en.wikipedia.org/wiki/Singleton_pattern。我将创建应用程序在单例下运行的主窗体,然后创建我希望在其他区域中触摸的窗体和控件的访问器。然后,其他表单可以获得指向他们想要修改的控件的指针,也可以获取他们希望更改的应用程序主要部分中的数据。
另一种方法是在不同的表单上设置事件进行通信,并使用主表单作为排序的中心,将事件消息从一个表单传递到应用程序中的另一个表单。
答案 2 :(得分:2)
访问表单的控件,如下所示:
formname.controls[Index]
您可以转换为适当的控件类型,例如:
DataGridView dgv = (DataGridView) formname.Controls[Index];
答案 3 :(得分:2)
这很简单,首先你可以像这样访问另一个表单:
(假设你的另一种形式是asdasdasdads<one or more spaces>
)
Form2
就是这样,你只需在//in Form 1
Form2 F2 = new Form2();
foreach (Control c in F2.Controls)
if(c.Name == "TextBox1")
c.Text = "hello from Form1";
的{{1}}中写TextBox1
。
答案 4 :(得分:1)
还有一种方法,如果你不想像Joe Dabones所说的那样循环通过“ALL”控件。 在Form2中创建一个函数并从Form1中调用它。
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
public void SetIndex(int value)
{
lsbMyList.SelectedIndex = value;
}
}
public partial class Form1 : Form
{
public Form2 frm;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
frm=new Form2();
frm.Show();
}
private void button1_Click(object sender, EventArgs e)
{
frm.SetIndex(Int.Parse(textBox1.Text));
}
}
答案 5 :(得分:0)
如果ChildForm
要访问ParentForm
将ParentForm
实例传递给ChildForm
构造函数。
public partial class ParentForm: Form
{
public ParentForm()
{
InitializeComponent();
}
public string ParentProperty{get;set;}
private void CreateChild()
{
var childForm = new ChildForm(this);
childForm.Show();
}
}
public partial class ChildForm : Form
{
private ParentForm parentForm;
public ChildForm(ParentForm parent)
{
InitializeComponent();
parentForm = parent;
parentForm.ParentProperty = "Value from Child";
}
}