maran program engineering (830029), страница 16
Текст из файла (страница 16)
В середины формынаходится компонент dataGridView из палитры Data, на котором и будет представлен двумерный массив. В принципе существуют две возможности обработки двумерного массива: считывать его элементы прямо из формы или создать83обычный двумерный массив, записать туда элементы с формы и обрабатыватьего. Последняя возможность предпочтительнее, если массив должен обрабатываться многократно, так можно избежать многократного преобразования данных. Нижнюю часть формы (метка и кнопка Класс, строку редактированиястрока) рассмотрим ниже, в п. 5.6.Реализация:До начала работы программы необходимо задать количество строк истолбцов. Считаем, что начальные их значения даны при проектировании(в нашем случае 3 и 4).
Во время работы программы их можно менять. Начальные значения дадим в конструкторе формы.public partial class Form1 : Form{int n, m;//n-количество строк, m–количество столбцовpublic Form1(){InitializeComponent();// определим количество строк и столбцовn = Convert.ToInt32(RowCnt.Text);m = Convert.ToInt32(ColCnt.Text);dataGridView1.RowCount = n;dataGridView1.ColumnCount = m;/* dataGridView1 имя поля представления двумерного массива RowCount количество строкColumnCount количество столбцов*/}private void Change_Click(object sender, EventArgs e){ // изменение количества строк и столбцов,// считаем, что их минимальное значение равно 2n = Convert.ToInt32(RowCnt.Text);m = Convert.ToInt32(ColCnt.Text);if (n < 2) n = 2;if (m < 2) m = 2;dataGridView1.RowCount = n;dataGridView1.ColumnCount = m;}private void Sum2_Click(object sender, EventArgs e){double x,sum = 0;for(int i=0;i<dataGridView1.Rows.Count;i++)for(int j=0;j<dataGridView1.Columns.Count;j++){84x = Convert.ToDouble(dataGridView1.Rows[i].Cells[j].Value);// чтение значений из формыsum += x;x *= 2.5;// изменения значенийdataGridView1.Rows[i].Cells[j].Value =x.ToString("F1");// вывод значений на форму}Sum1.Text = sum.ToString("F2");}Во втором варианте обработки двумерного массива используем для внутреннего представления массива стандартный класс DataTable.
Это класс в первую очередь предназначен для работы с таблицами баз данных, поэтому в немстолбцы могут иметь разный тип данных. В этом примере у нас все столбцыбудут иметь одинаковый тип данных, поэтому мы можем их задать в цикле.Внешний вид представлен на рис. 5.4, верхняя строка представляет номерастолбцов, первый столбец предназначен для номеров строк.Занесем на форму компонент dataGridView из группы Data и дадим емуимя Gr1. Этот компонент служит для представления таблицы (по сути двумерного массива) на форме. Для внутреннего представления двумерного массиваиспользуем стандартный класс DataTable (объект Tabel).В состав класса Form1 добавим функцию InitGrid с двумя параметрами:количество строк и количество столбцов.
Эта функция определяет свойствасоздаваемой таблицы и связывает ее с представлением на форме. Для начальной инициализации таблицы включим ее вызов в конструктор класса Form1.Рис. 5.485namespace WA1{public partial class Form1 : Form{DataTable Tabel;void InitGrid(int n, int m){Tabel = new DataTable();DataColumn x2 = Tabel.Columns.Add("First ",typeof(Int32));// Создание первого столбца, параметры: заглавие и тип// данных Первый столбец содержит имена строкDataColumn x1;for (int i = 0; i < m; i++){//создание остальных столбцов – для представления данныхx1 = Tabel.Columns.Add("Col " + (i + 1), typeof(Int32));x1.DefaultValue = 0;//Значение по умолчанию}for (int i = 0; i < n; i++){ //создание срокDataRow y = Tabel.NewRow();Tabel.Rows.Add(y);Tabel.Rows[i][0] = i+1;}x2.ReadOnly = true;// первый столбец для номеров, туда// нельзя ввести данныеGr1.DataSource = Tabel;// связывает внутреннее и внешнее представления данных}public Form1(){InitializeComponent();InitGrid(3, 4);//создание начальной таблицы}private void In1_Click(object sender, EventArgs e){ // изменение количества строк, столбцовint k,n;86k = Convert.ToInt32(textBox1.Text);//Количество столбцовn = Convert.ToInt32(textBox2.Text);//Количество строкInitGrid(k, n);}{private void First_Click(object sender, EventArgs e)//обработка данных из таблицыint sum = 0;for (int i = 0; i < Tabel.Rows.Count ; i++)for (int j = 1; j < Tabel.Columns.Count; j++)sum += Convert.ToInt32(Tabel.Rows[i][j]);rezult.Text=Convert.ToString(sum);}private void Second_Click(object sender, EventArgs e){ // изменеие данных в таблицеint y,z = 3;for (int i = 0; i < Tabel.Rows.Count ; i++)for (int j = 1; j < Tabel.Columns.Count; j++){y = Convert.ToInt32(Tabel.Rows[i][j]);y += z;Tabel.Rows[i][j] = Convert.ToString(y);}}Примечания.1.
Нумерация строк и столбцов начинается с нуля. Нулевой столбец мы используем для номеров строк, поэтому при обработке минимальное значение номеров столбцов равно единице, а номеров строк — нулю. Перваястрока считается стандартной, и она в нумерацию не входит.2. На рис. 5.4 форма показана после нажатия кнопки «Сумма».5.2. Создание многооконных приложенийMicrosoft Visual Studio позволяет создавать две разновидности многооконных приложений: SDI- и MDI-приложения. SDI-приложения состоят из нескольких независимых форм (окон). По умолчанию будет создано SDI-приложение.В MDI-приложении имеется одна главная форма, остальные формы находятся впределах главной; из главной формы можно управлять подчиненными формами.Единственное меню MDI-приложения находится в главном окне.87Перед созданием многооконного приложения его необходимо проектировать: продумать вопрос о том, какие окна нужны и что на них будет отображено.Форма — это разновидность класса.
Экземпляры классов, как известно, необходимо создавать. Это правило распространяется и на формы: автоматически создается лишь одна форма — главная. Создание всех остальных форм лежит на программисте. Закрытие формы функцией Close(); или нажатием на кнопку × вызывает уничтожение формы, и в случае необходимости она должна быть создана заново.В принципе, любую задачу можно решить как с помощью SDIприложения, так и с помощью MDI-приложения.
Пожалуй, создание SDIприложения проще. MDI-приложение можно рекомендовать при необходимости создать и работать одновременно с несколькими одинаковыми формами.Microsoft Visual Studio является SDI-приложением.5.2.1. Создание SDI-приложенияПусть наше приложение содержит следующие формы:− главная форма с меню;− форма для определения режимов работы программы;− форма «О программе» (About);− форма для ввода исходных данных и вывода результата.В момент запуска приложения на экране появляются первые две формы,остальные появляются при выборе соответствующего пункта меню.Пусть меню имеет следующую структуру:FileWindowsHelpQuitNewAboutOpen DialogГлавная форма содержит только меню, и поэтому она здесь не приводится.Форма для определения режимов работы (Form2) программы приведена на рис.
5.5.Две радиокнопки имеют имена rB1 и rB2; две кнопки выбора — именаcB1 и cB2; строка редактирования textBox1. Реализация единственной командной кнопки: Hide(); (убрать с экрана, но не уничтожить, в таком случае ее можно позже только открыть, нет необходимости ее заново создавать).Рис. 5.588Занесение на форму перечисленных компонентов ничем не отличается отрассмотренного выше, и мы на этом останавливаться не будем.
В связи с тем,что эта форма участвует в многооконном приложении, требуется выполнитьдополнительные действия.1. Во избежание случайного закрытия этой формы уберем с нее кнопку ×.Для этого дадим ее свойству ControlBox значение False. В нашем приложении мы предусмотрим только открытие этой формы во время работы приложения. Ее создание выполняется автоматически при запуске. Поэтому при случайном ее закрытии (с уничтожением) пользователь лишен возможности ее заново создать.2. Необходимо обеспечить доступ к радиокнопкам, кнопкам выбора истроке редактирования извне. По умолчанию они имеют атрибут доступа private и являются переменными своего класса (в нашем случаеForm2).
Для этого их свойствам Modifiers дадим значение public.3. Желаемое местоположение формы обеспечивается изменением значений двух ее свойств: для StartPosition выберем значение Manual и дляLocation задаем подходящие значения координат X и Y верхнего левогоугла. Таким образом, можем подбирать местоположение любой формы, в том числе и главной.4. Для обеспечения создания и открытия формы при запуске приложенияв класс главной формы внесем следующие дополнения:− Объявление Form2 f2; в раздел переменных.− В конструктор Form1 добавитьpublic Form1(){InitializeComponent();f2 = new Form2();//запуск конструктора классаf2.Show();//Передача сообщения объекту f2}5.
Реализация пункта меню Open Dialog: f2.Show();Для создания формы «О программе» используем заготовку: поставимкурсор мыши на имя нашего приложения, нажмем правую клавишу, из выпадающего меню выберем Add — New Item, затем из списка About Box и нажмемна кнопку Add. На экране появится заготовка формы «О программе».