BillWoodruff
Я собираюсь ответить на ваш вопрос очень "буквально", предполагая, что вы хотите запустить приложение WinForms со скрытой" первичной формой "и отображаемой Инициализированной формой, где пользователь вводит имя, а затем, когда пользователь закрывает инициализированную форму, вы хотите, чтобы ваша первичная форма (приложение) стала видимой и" захватила " информацию, введенную в инициализированную форму, чтобы вы могли использовать ее в своем приложении (первичная форма).
Итак, код InitialForm выглядит примерно так: предположим, что у вас есть текстовое поле и кнопка на нем, а также проводное событие нажатия кнопки:
public partial class InitialForm : Form
{
public InitialForm() { InitializeComponent(); }
// this 'exposes a string to the 'outside
public string UserEnteredText { get; private set; }
// see below for why you need to implement this
//private void InitialForm_FormClosing(object sender, FormClosingEventArgs e)
//{
//UserEnteredText = textBox1.Text;
//}
private void button1_Click(object sender, EventArgs e)
{
UserEnteredText = textBox1.Text;
Close();
}
}
Итак, PrimaryForm (с которой вы начинаете свое приложение) содержит:
// this code would not work in the Form Load Event
private void PrimaryForm_Shown(object sender, EventArgs e)
{
Visible = false;
InitialForm iform = new InitialForm();
iform.FormClosing += iform_FormClosing;
iform.Show();
}
// this will contain the text the user entered on the InitialForm
private string UserEnteredText;
// note that this could be called by either the user pressing
// the Button on the InitialiForm, or by closing the InitialForm
// by clicking its 'CloseBox
private void iform_FormClosing(object sender, FormClosingEventArgs e)
{
// note that we have to cast to 'InitialForm here
// to access its public property
UserEnteredText = (sender as InitialForm).UserEnteredText;
// show the Primary Form
Show();
// for testing only
MessageBox.Show("The user entered: " + UserEnteredText);
}
Но подождите: что произойдет, если у InitialForm был CloseBox, и пользователь закрыл его ? Свойство public string InitialForm
никогда бы не поставили: таким образом, вам нужно добавить FormClosing EventHandler в InitialForm и "подключить его" (как показано в закомментированном коде выше для InitialForm):
private void InitialForm_FormClosing(object sender, FormClosingEventArgs e)
{
UserEnteredText = textBox1.Text;
}
Рассмотрим преимущества и недостатки использования техники, показанной здесь:
1. Обратная сторона: InitialForm утилизируется: вы никогда не "сохраняли ссылку на него". вам не нужно было писать пользовательское событие в InitialForm и подписываться на него в первичной форме. Вам не нужно было (Хвала Господу) возиться с хитрым уведомлением об изменении свойств WinForm. Вам не нужно было делать ничего "модального"."
2. недостаток: вы не держите InitialForm рядом для возможного повторного использования: и это вполне вероятно (?). Написание пользовательского события в InitialForm, вызванного событием нажатия кнопки, на которое вы подписались в PrimaryForm, вполне может привести к "более чистому", более понятному и поддерживаемому коду.
Наконец: просто сделав InitialForm не имеющим CloseBox, вы можете устранить показанный здесь причудливый танец ручки в случае закрытия пользователем InitialForm таким образом, чтобы вы не могли "получить" информацию из его текстового поля.