2011-01-10 5 views
1

Мне нужно обновить ListBox Form2, созданный динамически. Предположим, что в случае, когда мне нужно обновить этот ListBox (в Form1, конечно), у меня нет ссылки на этот Form2, поэтому я не могу вызвать метод UpdateList (и нет, я не могу сделать его статическим) ,Как я могу просмотреть все открытые экземпляры конкретной формы?

Я даже не знаю, открыта ли форма 2, это может быть или нет.

Что вы предлагаете?

Есть ли способ пройти через все открытые позиции формы2?

Пример кода:

//Form1 

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

//SOMEWHERE IN FORM1 

Form2 runTime = new Form2(); 

//Form2 

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

Похоже, вам нужно выяснить, как лучше управлять своими формами. «Экземпляр или несколько может быть или не быть открытым, я действительно не знаю», звучит как неудержимый беспорядок. Вы ошибаетесь в ООП. –

+0

Вы правы, на самом деле этот вопрос скорее любопытство, чем реальное нуждающееся ^^ – raz3r

ответ

6

Я не уверен, что именно вы хотите реализовать. Но мне кажется, что вы можете просто перебирать коллекцию открытых форм:

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

Эта линия даст вам IEnumerable всех открытых экземпляров Form2 в приложении. Вы можете использовать свой собственный строковое представление (не форма заголовка используется в приведенном выше фрагменте кода)

+2

+1, конечно, но учтите также: http://stackoverflow.com/questions/3751554/application-openforms-count- 0-always :) –

+0

@ Shadow Wizard, спасибо за хороший момент. Теперь мне нужно пересмотреть локализацию в моем последнем проекте :) –

+0

Я собираюсь попробовать, в то же время спасибо, выглядит очень полезно! – raz3r

3

Я хотел бы добавить, все ссылки Form2 к 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 закрыт, удалите его из списка (здесь: on formClosed event)

+0

Ответ от MAKKAM звучит неплохо (Application.OpenForms ....) Если вы хотите отреагировать на некоторые формы2-события, это решение также может помочь вам. –

+0

Я тоже думал о массиве, но я хотел реализовать что-то новое и «необычное», спасибо в любом случае! – raz3r

+2

Это правильный способ сделать это, хотя List <> является излишним для вопроса. Читайте комментарии к ответу маккама, почему это намного лучший способ сделать это. –

Смежные вопросы