C# и Я

О программировании в C#, о себе и немного флуда на разнообразные темы.

Работа с формами в Visual Studio C#.

Visual Studio, Аналогии, by admin.

visualcВ принципе, чтобы понять основы программирования в C# после изучения какого-либо объектно-ориентированного языка программирования  много времени не требуется. Основные принципы ООП никто не отменял, а если понять их логику, то на изучения правил языка потребуется немного времени, а дальше – оттачивание навыков, углубленное изучение отдельных вопросов программирования и т.д., в общем, все как обычно. Проблемы начинаются, когда приходится избавляться от “вредных” привычек при переходе на C#, например от привычки работы с формами. Попробую пояснить это на простом примере, в котором рассмотрим работу с формами в Visual Studio Express C#.

Давайте создадим новый проект в Visual Studio. Для этого в главном меню студии выбираем “Файл – Создать проект” и в открывшемся окне выбираем “Приложение для Windows Forms”:

newproject 

Зададим имя проекту, например, “TestApp” и нажмем кнопку “Ok”. Студия создаст нам пустое приложение, состоящее из одной формы и услужливо покажет нам её конструктор:

constructorТеперь создадим ещё одну форму – её мы будем вызывать по какому-либо событию. Для добавления новой формы выбираем в меню Visual Studio: “Проект – Добавить форму Windows…” в открывшемся оке необходимо выбрать “Форма Windows Forms” и задать её имя:

newform

Т.к. сегодня рассматриваем пример, то я не стал менять названия форм (думаю, так будет проще понять что и как делается), но в нормальных проектах следует сразу задавать всем элементам осмысленные названия. Итак, добавили вторую форму в наше приложение.

Теперь разберемся как показать вторую форму пользователю. Те, кто немного знают Delphi могут сказать “Что может быть проще – добавил в uses модуль и вызывай”. Действительно проще некуда, но не совсем так просто как в Delphi. Объясню на примере.

Бросаем на первую форму кнопку Button. Затем переходим в окно “Свойства”, выбираем “События” и двойным кликом мышки, напротив события Click создаем новый обработчик:

options

Вначале, попробуем написать в обработчике следующий код:

private void button1_Click(object sender, EventArgs e)
  {
    Form2.Show();
  }

Сразу же получим внятное сообщение об ошибке:

"Ошибка 1 Для нестатического поля, метода или свойства "System.Windows.Forms.Control.Show()" требуется ссылка на объект …"

Почему так? Дело в том, что, работая в Delphi мы могли не задумываться над тем почему, приведенный выше код мог работать без проблем – там Form2 – глобальная переменная класса TForm2. И эта переменная уже проинициализирована. Тут может быть несколько мнений, кто-то скажет "Это удобно, быстро", другой – "Глобальные переменные – зло". Разработчики С# относятся как раз к "другим" и я с ними согласен – где возможно следует избавляться от использования глобальных переменных. Второй момент – в C# Form2 – это название класса, а мы, следуя “вредной” привычке из Delphi могли предположить, что это переменная. Отсюда и ошибка. Добрались до сути. Осталось найти решение. А решение довольно простое – надо создать переменную и работать с ней:

private void button1_Click(object sender, EventArgs e)
 {
   Form2 secondForm = new Form2();
   secondForm.Show();
 }

Теперь все заработает нормально. Запускаем приложение, жмем кнопку и получаем вторую форму:

testapp

Как открыть вторую форму в модальном режиме, т.е., чтобы нельзя было переключиться на первую, пока вторая открыта. Для этого необходимо вызвать метод ShowDialog(). Можно так:

private void button1_Click(object sender, EventArgs e)
 {
   Form2 secondForm = new Form2();
   secondForm.ShowDialog();
 }

А можно так:

private void button1_Click(object sender, EventArgs e)
 {
   Form2 secondForm = new Form2();
   secondForm.ShowDialog(this);
 }

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

private void button1_Click(object sender, EventArgs e)
 {
   Form2 secondForm = new Form2();
   //скрываем форму из панели задач
   secondForm.ShowInTaskbar = false;
   //устанавливаем форму по центру экрана
   secondForm.StartPosition = FormStartPosition.CenterScreen;
   secondForm.ShowDialog(this);
 }

Как видите, после Delphi работа с формами в Visual Studio оказывается такой же простой, просто необходимо избавиться от вредной привычке – использования глобальных переменных.


Related posts:

  1. Работа со строками в C#.

Back Top

Responses to “Работа с формами в Visual Studio C#.”

Comments (6) Trackbacks (0) Leave a comment Trackback url
  1. Случайно набрел на Ваш блог
    Спасибо, все весьма доходчиво…
    Не думал что после «Делфей» споткнусь на таких вещах =)
    А не могли бы Вы описать каким образом открыв Form2 закрыть Form1 ?
    В моем случае либо открывает и висят обе формы, либо совсем не открывает =)
    В C S новичок

    • >>Не думал что после «Делфей» споткнусь на таких вещах =)
      После делфей тут и не на таком спотыкаться приходится :)
      >>А не могли бы Вы описать каким образом открыв Form2 закрыть Form1 ?
      Если вторая форма открыта модально, то первая и не закроется. А если открывать вторую форму не модально, то первую потом можно закрыть, например так:
      Form1 myform = new Form1();
      myform.Close();

      >>В C S новичок
      Я тоже :)

  2. =)
    Не получается
    private void button2_Click(object sender, EventArgs e)
    {
    Form2 frm = new Form2();
    frm.Show();

    Form1 fmr2 = new Form1();
    fmr2.Close();
    }
    Первая форма висит на заднем плане, уже час ковыряюсь…

  3. Воооот!
    Вдруг пригодится :)

    Form1.ActiveForm.Hide();
    Form2 fmr = new Form2();
    fmr.ShowDialog();
    Close();

  4. Спасибо Николай, час ковырялся с закрытием первой формы. Последнее решение помогло.

  5. Хорошая статья, спасибо

  1. No trackbacks yet.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*