2011-01-10 63 views
1

我需要更新動態創建的Form2的ListBox。假設我必須更新這個ListBox(在Form1當然),我沒有這個Form2的引用,所以我不能調用UpdateList方法(並且不,我不能使它成爲靜態的) 。如何循環遍歷特定表單的所有打開的實例?

我甚至不知道是否有一個Form2打開,它可能與否。

你有什麼建議?

有什麼方法可以循環遍歷Form2的所有開放狀態?

代碼示例:

//Form1 

public void event() 
{ 
    //UPDATE FORM2 LISTBOX 
} 

//SOMEWHERE IN FORM1 

Form2 runTime = new Form2(); 

//Form2 

public void UpdateList() 
{ 
    //UPDATE LISTBOX 
} 
+1

這聽起來像你需要找出更好的方式來管理你的表單。 「一個或幾個實例可能會或可能不會開放,我不知道」聽起來像是一個難以維繫的混亂。你在做OOP錯誤。 – 2011-01-10 12:32:27

+0

你說得對,其實這個問題更多的是好奇心,而不是真正的需要^^ – raz3r 2011-01-10 13:14:59

回答

6

我不知道究竟你要實現。但在我看來,你可以只通過打開的表單收集迭代:

var formsList = Application.OpenForms.OfType<Form2>(); 
listBox.Items.AddRange(formsList.Select(f=>f.Text).ToArray()); 

此行會給你在應用程序中所有打開的窗體2實例的IEnumerable的。您可能需要使用自己的字符串表示(未在上面的代碼片段中使用的窗體標題)

+2

+1當然,但也要考慮到這一點:http://stackoverflow.com/questions/3751554/application-openforms-count- 0-永遠:) – 2011-01-10 12:42:35

3

我想補充的所有窗體2引用到一個ArrayList(其它一些其他的集合類,如列表)

/// form1 
List<Form2> list = new List<Form2>(); 

void createForm2(object sender, EventArgs e) 
{ 
    Form2 newForm = new Form2(); 
    newForm.FormClosed += new FormClosedEventHandler(form2_closed); 
    list.add(newForm); 
} 

void updateListBox() 
{ 
    for each (Form2 curform in list) 
    { 
     curform.updateListbox(); 
    } 
} 

void form2_closed(object sender, FormClosedEventArgs e) 
{ 
    list.Remove(sender); 
    updateListBox(); // in case a form2 instance is closed, recall method 
} 

/// form2 
public void updateListbox() 
{ 
    // enter code here ... 
} 

在Form2實例關閉的情況下,將它從列表中刪除(這裏是:formClosed事件)