如何从子Winform访问父Winform中的控件
本文关键字:Winform 控件 访问 | 更新日期: 2023-09-27 18:24:19
我有一个Windows窗体,点击按钮即可执行此代码:
childForm frm = new childForm();
frm.ShowDialog();
frm.Close();
因此,当childForm打开时,我想从父级上的ListBox控件复制一些数据,以便在childForm的ListBox中显示和使用它。所以,理想情况下,我想以这样的方式引用父窗体来实现这一点,但我尝试过的每一种方法都失败了。看起来很容易。childForm不是MdiForm。
ListBox.Items
集合几乎可以容纳任何东西,因此我建议修改子窗体以接受任何类型的集合来填充ListBox
。这样,孩子就不必对集合本身中的项目进行强制转换,您可以对它们执行所需操作。
修改子窗体以接受要传递的数据:
public class childForm : Form
{
private IEnumerable<SomeClass> itemsFromParent;
public childForm(IEnumerable<SomeClass> itemsFromParent)
{
...
...
this.itemsFromParent = itemsFromParent;
}
}
然后将集合传递给子级:
using (var frm = new childForm(yourListBox.Items.Cast<SomeClass>()))
{
frm.ShowDialog();
}
您需要将父窗体(this
)作为参数传递给子窗体的构造函数。
在ChildForm
构造函数中发送ListBox
控制数据。或者您可以发送父窗体的实例。
childForm frm = new childForm(ListBox lb);
frm.ShowDialog();
frm.Close();
子窗体:
public partial class childForm: Form
{
public childForm(ListBox parentlb)
{
InitializeComponent();
//use parentlb, traverse through items
//or assign items to private member of this class
}
}
Grant Winney已经提出了一个很好的解决方案,您可以将集合或列表直接传递到您的子窗体构造函数中。另一种方法是,您可以在子窗体中创建一个属性,并从子窗体外部访问它。
通过在子窗体中创建属性,可以在窗体关闭后从子窗体中取回项目。
public class childForm : Form
{
public List<string> Items { get; set; }
private void childForm_Load(object sender, EventArgs e)
{
lstMyListBox.DataSource = Items;
}
}
现在,您可以将列表框(父窗体)的选定项目分配给子窗体,如
List<stirng> lstItems = new List<stirng>();
foreach (var item in listBox1.SelectedItems)
{
lstItems.Add(item.ToString());
}
childForm frm = new childForm();
frm.Items = lstItems;
frm.ShowDialog();
frm.Close();