Опубликован: 11.09.2006 | Доступ: свободный | Студентов: 7649 / 473 | Оценка: 4.26 / 3.45 | Длительность: 30:46:00
ISBN: 978-5-9556-0080-2
Лекция 3:

Работа с элементами управления (продолжение)

Создание Мастера

Во многих программах, когда требуется получить последовательный ряд каких-либо значений, диалоговые окна представляют в виде Мастера1Точный перевод c англ. слова Wizard – "волшебник", но, следуя устоявшейся традиции, я буду использовать далее слово "Мастер". (Wizard). В программе Ballet с помощью Мастера пользователь вводит необходимые параметры, причем они также проходят проверку (рис. 3.24).

Мастер регистрации пользователя

увеличить изображение
Рис. 3.24. Мастер регистрации пользователя

Форма Мастера появляется при выборе пункта главного меню "Новый пользователь" : 2Здесь и далее приводятся только те фрагменты кода, о которых идет речь в текущем разделе.

private void itemNewUser_Click(object sender, System.EventArgs e)
  {
 //Создаем экземпляр wizard формы CreateUserWizard
 CreateUserWizard wizard = new CreateUserWizard();
 //Показываем форму:
 wizard.ShowDialog();
 …
  }

Форма CreateUserWizard (рис. 3.25) представляет собой контейнер для форм CUWStep1, CUWStep2, CUWStep3.

Родительская форма CreateUserWizard и дочерние  формы CUWStep1, CUWStep2, CUWStep3 в режиме дизайна

увеличить изображение
Рис. 3.25. Родительская форма CreateUserWizard и дочерние формы CUWStep1, CUWStep2, CUWStep3 в режиме дизайна

Обратите внимание на заголовок запущенной формы CreateUserWizard — к нему добавляются названия дочерних форм. После запуска формы CreateUserWizard в нее загружается форма CUWStep1:

private void CreateUserWizard_Load(object sender, System.EventArgs e)
  {
 …  
 CUWStep1 step1 = new CUWStep1(identity);
 step1.MdiParent = this;
 step1.Show();
  }

В обработчике кнопки "Далее" проверяется значение, введенное в текстовое поле, затем закрывается текущая форма и вызывается форма CUWStep2:

private void btnNext_Click(object sender, System.EventArgs e)
  {
 if(txbEmail.Text == "")
 {
   MessageBox.Show("Введите адрес электронной почты.");
   return;
 }
 else
 {
   …
   CUWStep2 step2 = new CUWStep2(this.identity);
   step2.MdiParent = this.MdiParent;
   this.Close();
   step2.Show();
 }
  }

В обработчике кнопки "Далее" формы CUWStep2 для проверки введенного значения снова применяется преобразование типов данных:

private void btnNext_Click(object sender, System.EventArgs e)
{
 if(txbPop3.Text == "")
 {
   MessageBox.Show("Введите адрес сервера POP3");
 }
 else
 {
   this.identity.Pop3 = txbPop3.Text;
   try
   {
  //Преобразовываем введенное значение в тип Int32 
  this.identity.Pop3Port = Int32.Parse(txbPop3Port.Text);
  CUWStep3 step3 = new CUWStep3(this.identity);
  step3.MdiParent = this.MdiParent;
  this.Close();
  step3.Show();
   }
   catch(Exception)
   {
  MessageBox.Show("Значение порта должно быть числом");
   }
 }
  }

В последнем шаге Мастера необходимо закрыть не только форму CUWStep3, но также родительскую форму CreateUserWizard, которая, в свою очередь, является дочерней по отношению к главной форме mainForm. Родительская форма CreateUserWizard будет активной в этот момент, поэтому метод ActiveForm.Close() закроет ее:

private void btnFinish_Click(object sender, System.EventArgs e)
  {
 if(txbSmtp.Text != "")
 {
   this.identity.Smtp = txbSmtp.Text;
   //Закрываем текущую форму
   this.Close();
   Thread.CurrentPrincipal = new GenericPrincipal
(this.identity, new string[]{"user"});
   this.identity.Dispose();
   //Закрываем родительскую форму CreateUserWizard  
   Form.ActiveForm.Close();
   
 }
 else
 {
   MessageBox.Show("Введите адрес сервера SMTP");
 }
  }

Итак, при запуске Мастера применяется форма, в которую последовательно загружаются дочерние формы. После выполнения всех действий в коде дочерней формы закрывается главная.

Запуск формы-заставки при загрузке приложения

При запуске программы Ballet появляется список пользователей, из которого требуется выбрать заданного для начала работы с программой (рис. 3.26).

Форма выбора пользователя программы Ballet

Рис. 3.26. Форма выбора пользователя программы Ballet

После выбора запускается программа, авторизованная данным пользователем. При определении обработчика события Load главной формы указывается метод itemUsers_Click:

this.Load += new System.EventHandler(this.itemUsers_Click);

Этот же обработчик привязан к пункту меню "Смена пользователя" в главном меню, он и вызывает форму выбора пользователя:

private void itemUsers_Click(object sender, System.EventArgs e)
  {
 selectUser select = new selectUser();
 if(select.ShowDialog() != DialogResult.OK)
 //Запускаем главную форму.
   return;
…
 //Вызываем метод ActivateEventItem
 this.ActivateEventItem();
  }

В обработчике кнопки "Выбор" проверяется, выбран ли хотя бы один пользователь из списка:

private void btnSelect_Click(object sender, System.EventArgs e)
  {
  if(lstViewUsers.SelectedItems.Count == 0)
  MessageBox.Show("Выберите пользователя для начала работы",
 "Пользователь не выбран");
  else
  {
 this.DialogResult = DialogResult.OK;
 this.Close();
  }
  }

После выбора появляется главная форма — это указывается в обработчике itemUsers_Click. Если миновать выбор пользователя, главная форма запускается с недоступным пунктом меню "Действия". После выбора пользователя вызывается метод ActivateEventItem, в котором включается пункт меню:

private void ActivateEventItem()
  {
 //Включаем доступность пункта меню "Действия".
 this.itemEvent.Enabled = true;
  }
Елена Дьяконова
Елена Дьяконова

При нажатии на Сумма в примере ArbitraryMethod из Лекция 7, VS 2013 выдается ошибка: 

Необработанное исключение типа "System.InvalidOperationException" в System.Windows.Forms.dll

Дополнительные сведения: Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "lblResult" не из того потока, в котором он был создан.

Затем:

Необработанное исключение типа "System.InvalidOperationException" в mscorlib.dll

Дополнительные сведения: Для каждой асинхронной операции метод EndInvoke может вызываться только один раз.

Александр Сороколет
Александр Сороколет

Свойство WindowState формы blank Maximized. Не открывается почемуто на всё окно, а вот если последующую форму бланк открыть уже на макс открывается :-/