如何从子Winform访问父Winform中的控件

本文关键字:Winform 控件 访问 | 更新日期: 2023-09-27 18:24:19

我有一个Windows窗体,点击按钮即可执行此代码:

childForm frm = new childForm();
frm.ShowDialog();
frm.Close();

因此,当childForm打开时,我想从父级上的ListBox控件复制一些数据,以便在childForm的ListBox中显示和使用它。所以,理想情况下,我想以这样的方式引用父窗体来实现这一点,但我尝试过的每一种方法都失败了。看起来很容易。childForm不是MdiForm。

如何从子Winform访问父Winform中的控件

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();