2014-09-24 41 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(); 
相關問題