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

时间:2014-09-24 00:28:25

标签: c# winforms

我有一个Windows窗体,在单击按钮时执行此代码:

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

因此,当childForm打开时,我想从父类的ListBox控件中复制一些数据以显示并在childForm的ListBox中使用它。所以,理想情况下,我想以这样的方式引用父表单,但我尝试的每种方法都失败了。好像很容易。 childForm不是MdiForm。

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

您需要将父表单(this)作为参数传递给子表单的构造函数。

答案 2 :(得分:0)

ListBox构造函数中发送ChildForm控件数据。或者您可以发送父表单的实例。

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

<强> ChildForm

public partial class childForm: Form
{ 
    public childForm(ListBox parentlb)
    {
        InitializeComponent();

        //use parentlb, traverse through items 
        //or assign items to private member of this class

    }
}

答案 3 :(得分:0)

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