2014-09-24 77 views
0

我有一个Windows窗体是在点击一个按钮执行此代码:如何从子Winform访问父级Winform中的控件?

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

所以childForm打开时,我希望将一些数据从一个ListBox控件复制父显示和在ListBox使用在childForm中。所以,理想情况下,我想以这种方式来引用父表单,但是我尝试过的每种方法都失败了。似乎这很容易。 childForm不是MdiForm。

回答

0

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

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 

    } 
} 
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

+1为解决上述(a)的关注和分离唯一的答案(B )使用_using_子句进行内存管理。 – groverboy 2014-09-24 03:56:06

0

格兰特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();