2009-07-19 5 views
1

В кнопке нажмите даже обработчик Form1, я хочу создать Form2. Вот мой код,Проблемы с созданием новой формы

даже обработчик button1 из Form1

// button1 belongs to Form1 
private void button1_Click(object sender, EventArgs e) 
{ 
    Form2 form2 = new Form2("www.google.com"); 
    form2.ShowDialog(); 
} 

Form2 застройщик

public Form2 (string str) 
{ 
    InitializeComponent(); 
    address = str; 
    button2.Text = str; // button2 belongs to Form2 
} 

public Form2() 
{ 
    InitializeComponent(); 
} 

Мой вопрос и беспокойство, кнопка 1 обработчик события выполняется UI потоке Form1, и если Я создаю новый Form2 внутри потока интерфейса Form1 и использую поток пользовательского интерфейса для установки элемента интерфейса Form2 (button2.Text), является ли это законным? Мое понимание состоит в том, что каждая из форм имеет свой пользовательский поток пользовательского интерфейса, а элементы пользовательского интерфейса (например, кнопка) должны обрабатываться только отдельными частями владельца. Если мой код неправильный, оценили, может ли кто-нибудь показать мне, что является изящным способом создания другой формы внутри обработчика событий текущей формы и параметров прохода.

Я использую VSTS 2008 + C# + .Net 2.0.

ответ

1

Это законно и должно работать нормально.

+0

Я хочу знать, сколько бы форм я не создавал, все они будут делиться одним и тем же единственным потоком пользовательского интерфейса? – George2

6

Ваш код в порядке. Обе формы будут жить в одном потоке и могут обращаться друг к другу, не беспокоясь о потоковом использовании. Никакие новые нити не появляются, если вы конкретно не говорите об этом, в этом случае.

В качестве побочного примечания я хотел бы немного изменить ваш конструктор Form2. Я предполагаю, что Form2 также имеет конструктор по умолчанию без параметров и что этот конструктор также вызывает InitializeComponent? Если это так, нет необходимости дублировать этот вызов в вашем конструкторе; если вы установите его, как это, он будет первым запустить конструктор по умолчанию, а затем добавить свой собственный материал:

public Form2 (string str) : this() 
{ 
    address = str; 
    button2.Text = str; // button2 belongs to Form2 
} 
+0

Спасибо Fredrik, я отправил мой другой конструктор Form2, и он имеет только одну строку кода для вызова InitializeComponent. Есть ли какая-либо функциональная ошибка моего кода (если я просто сохраняю свой код, как он теперь показан в моем исходном сообщении) по сравнению с вашим? – George2

+1

Нет, в коде отсутствует ошибка или ошибка. Это всего лишь вопрос или отказ от кода в разных местах, делающих то же самое; удаление избыточности, больше ничего. –

+0

Означает ли это, независимо от того, сколько форм я создаю в приложении Windows Forms, все формы будут иметь один и тот же единственный поток пользовательского интерфейса? – George2

2

В Winforms, все элементы пользовательского интерфейса в пределах общего ресурса приложения тот же интерфейс потока. Поэтому будьте уверены, нет ничего плохого в вашем коде в этом смысле.

+0

Вы имеете в виду, сколько бы Форм я не создал, все они будут делиться одним и тем же потоком пользовательского интерфейса? – George2

+1

Правильно. Все формы, принадлежащие одному и тому же приложению, будут иметь один и тот же поток пользовательского интерфейса. –

1

И вторая форма будет использовать ту же нить, как form1

+0

Означает ли это, сколько форм, которые я создаю, в приложении Windows Forms, все формы будут иметь один и тот же единственный поток пользовательского интерфейса? – George2

+0

да. только в том случае, если новая форма будет в другом потоке, если вы создаете форму, используя другую тему. – Marcom

1

Ваш код абсолютно легально :-) Documentation только говорит, что любой элемент управления UI должен быть доступ только из потока, на котором он был создан.

+0

Означает ли это, независимо от того, сколько форм я создаю в приложении Windows Forms, все формы будут иметь один и тот же единственный поток пользовательского интерфейса? – George2

+0

как mliesen сказал: «Все формы будут работать в одном потоке (если только вы не начнете новый поток и не создадите форму внутри этого потока)». – chikak

1

Все формы будут работать в одном потоке (если только вы не запустите новый поток и не создадите форму в этом потоке).

+0

Означает ли это, независимо от того, сколько форм я создаю в приложении Windows Forms, все формы будут иметь один и тот же единственный поток пользовательского интерфейса? – George2

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