Обработчики событий главной формы



 

    Режим создания массива 6 прямоугольников можно реализовать в главной форме, а отображение результатов работы этого режима в формах 2 и 3.

Исходный код главной формы будет иметь следующий вид:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

 

namespace WindowsFormsApplication1

{

 public partial class Form1 : Form

 {

public static int[,] a = new int[6, 6];   

public Form1()

{

InitializeComponent();

}

private void button1_Click(object sender, EventArgs e)

{

Random rnd = new Random();

for (int i = 0; i < 6; i++)

{

for (int j = 0; j < 4; j++)

{

a[i, j] = rnd.Next() % 201 - 100;

}

}

for (int i = 0; i < 6; i++)

{

if(Math.Abs(a[i,0]-a[i, 2]) == Math.Abs(a[i, 1] - a[i, 3]))

  a[i, 4] = 1; else a[i, 4] = 0;

a[i,5]=Math.Abs(a[i,0]-a[i,2])*Math.Abs(a[i,1]-a[i,3]);

}

}

private void button2_Click(object sender, EventArgs e)

{

int y;

Form2 f2 = new Form2();

f2.ShowDialog();

}

private void button3_Click(object sender, EventArgs e)

{

Form3 f3 = new Form3();

f3.ShowDialog();

}

private void button4_Click(object sender, EventArgs e)

  {

Form4 f4 = new Form4();

f4.Show();

}

 }

}

При создании массива в 5 столбец будем записывать информацию о прямоугольнике 0 – квадрат, 1 – обычный прямоугольник, а 6 столбец значение площади прямоугольника.

В нашем проекте запланировано несколько форм. Естественно возникает вопрос можно ли открывать одновременно несколько форм и как переходить с одной формы на другую? Ответ на этот вопрос зависит от того как было открыто окно.

Каждое окно (форма) можно открыть как модальное (как "диалоговое окно") или как немодальное (как обычное окно).

Если окно открывается методом Show(), то она задает обычное окно; если окно открывается методом ShowDialog(), то она открывается как диалоговое окно. В чем разница? Из диалогового окна нельзя выйти, не закончив диалог и не закрыв форму. Открыв диалоговое окно, нельзя переключиться на работу с другой формой, не закончив диалог. Закрыть диалоговое окно можно разными способами. Можно щелкнуть по крестику, расположенному в правом верхнем углу формы или специальной кнопкой.

Если форма открыта методом Show, как не диалоговое окно, то, не закончив работу с открытой формой, можно перейти в главную форму или другую немодальную форму, поработать там, нажав какие-нибудь командные кнопки, получив нужную информацию, а затем снова вернуться к исходной форме.

В нашем приложении мы используем оба способа открытия окон форм.

Для закрытия окна можно также применять два метода – Hide() и Close(). Первый из этих методов скрывает форму, второй закрывает. Для диалоговых окон можно применять как метод Hide(), так и метод Close(): эффект будет одинаков – диалоговое окно будет закрыто.

Метод Hide() можно применять и для немодальных форм, открытых методом Show(). Окно, открытое не для диалога, можно временно скрыть, вызвав метод Hide(), а затем показать, вызвав метод Show().

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

        

Табличная форма представления и редактирования значений

 

Рассмотрим обработчики событий окна табличной формы представления и редактирования значений координат вершин прямоугольников.

Обработчики реализованы на форме 2, изображенной на рисунке 6.6. Для табличной формы представления значений массива использован элемент DataGridView. Рассмотрим его применение в интерфейсе, позволяющем пользователю вводить и отображать двумерные массивы.

 

 

Рисунок 6.6 – Табличная форма представления значений массива

 

В свойствах элемента DataGridView выбираем Columns и запускаем редактор параметров столбцов таблицы, в котором мы добавляем необходимое количество столбцов и определяем название столбцов в окне формы и имя столбцов в программе (см. рисунок 6.7). С помощью редактора столбцов определяются их ширина в окне формы.

 

 

Рисунок 6.7 – Работа с редактором столбцов DataGridView

 

Исходный код формы 2 имеет следующий вид:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

 

namespace WindowsFormsApplication1

{

 public partial class Form2 : Form

 {

public static int i, j;

public static string kop;

public Form2()

{

InitializeComponent();

}

private void button1_Click(object sender, EventArgs e)

{

for (i = 0; i < 6; i++)

{

dataGridView1.Rows.Add();

for (j = 0; j < 6; j++)

{

dataGridView1.Rows[i].Cells[j].Value=Form1.a[i,j].ToString();

}

if (Form1.a[i,4]==0) dataGridView1.Rows[i].Cells[4].Value = "Прямоугольник";

else dataGridView1.Rows[i].Cells[4].Value = "Квадрат";

}

}

private void button2_Click(object sender, EventArgs e)

{

Close();

}

private void button3_Click(object sender, EventArgs e)

{

string elem = "";

bool ok;

int k;

for (i = 0; i < 6; i++)

for (j = 0; j < 4; j++)

{

do

{

ok = true;

try

{

  elem = dataGridView1.Rows[i].Cells[j].Value.ToString();

  Form1.a[i, j] = int.Parse(elem);

}

catch (Exception any)

{

  Form5 f5 = new Form5();

  if (f5.ShowDialog() == DialogResult.OK) k = 0;

  dataGridView1.Rows[i].Cells[j].Value = kop;

  ok = false;

}

} while (!ok);

}

for (i = 0; i < 6; i++)

{

 if (Math.Abs(Form1.a[i,0]-Form1.a[i,2]) == Math.Abs(Form1.a[i, 1] - Form1.a[i, 3])) Form1.a[i, 4] = 1;

           else Form1.a[i, 4] = 0;

Form1.a[i, 5] = Math.Abs(Form1.a[i, 0] - Form1.a[i, 2]) * Math.Abs(Form1.a[i, 1] - Form1.a[i, 3]);

}

}

}

}

 

На форме 2 реализованы 3 обработчика событий – вывод матрицы в таблицу элемента DataGridView, редактирование значений матрицы и возврат к 1 форме. Рассмотрим каждый фрагмент кода отдельно.

Вывод матрицы в таблицу элемента DataGridView содержит цикл перебора строк таблице, в котором программно добавляется очередная строка и запускается цикл перебора столбцов таблицы. 

Поскольку массив сформирован в виде глобальной переменной формы 1, то его использование в форме 2 требует следующей записи Form1.a[i,j].

Значение столбца 4 двумерного массива анализируется на наличие 0 – признак равенства сторон прямоугольника (квадрат).

В последний столбец выводится значение площади прямоугольника.

Процесс редактирования элементов DataGridView включает непосредственное изменение значений на форме 2 и запуск обработчика «Редактирование объекта», в котором содержимое элементов DataGridView переписывается в массив формы 1. Процесс перезаписи находится в охраняемом блоке. Если вы вместо цифр случайно введете символ буквы или другой знак, то запускается обработчик ошибочной ситуации, который создаст и откроет 5 диалоговое окно для повторного ввода ошибочного значения (см. рисунок 6.8).

Исходный код формы 5:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

 

namespace WindowsFormsApplication1

{

 public partial class Form5 : Form

 {

public Form5()

{

InitializeComponent();

label1.Text = "a[" + Form2.i.ToString() + "," + Form2.j.ToString() + "]= ?";

}

private void button1_Click(object sender, EventArgs e)

{

Form2.kop = textBox1.Text;

Close();

  }

 }

}

Исправление ошибок ввода продолжается пока не будет введено правильное числовое значение.     

Если в результате редактирования элементов DataGridView изменяется тип прямоугольника, например, получается квадрат, то это учитывается в 4 столбце массива. Одновременно перезаписывается новое значение площади нового прямоугольника.

 

 

Рисунок 6.8 – Исправление ошибки ввода

 

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

 

dataGridView1.Columns.Clear();

DataGridViewColumn column;

for (int i = 0; i < 6; i++)

{

column = new DataGridViewTextBoxColumn();

column.DataPropertyName = "Column" + i.ToString();

column.Name = "Column" + i.ToString();

dataGridView1.Columns.Add(column);

}

В первой строке кода мы удаляем предыдущее «состояние столбцов» элемента DataGridView, объявляем переменную column а в цикле создаем объект column, которому присваиваем имя для формы и имя для программы и добавляем созданный объект нашему элементу.

 


Дата добавления: 2019-02-12; просмотров: 123; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!