Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Программирование на языке C# Консольные и оконные приложения. Лабораторный практикум. Учебное пособие
.pdf
Пример 7. Отсортировать список ListBox.
Решение. Возможные варианты решения, следующие:
1) можно установить свойство Sorted (Behavior) в инспекторе объектов, при разра-
ботке программы, в значение true;
2) можно вписать в обработчик события (например, в конструктор формы):
listBox1.Sorted = true;
Пример 8. Содержимое ListBox1 сохранить в файле.
Решение. Подобно чтению всех строк из текстового файла в компонент, можно все стро-
ки из компонента, например, ListBox1 сохранить в файле. Это можно проделать командой
File.WriteAllLines (@"Test1.txt", listBox1.Items, Encoding.Default);
Здесь методу WriteAllLines класса File, передаются: путь, список строк и способ ко-
дирования.
Пример 9. Очистить список ComboBox.
Решение:
comboBox1.Items.Clear();
Пример 10. Изменить строку с номером 8, взятую из списка ListBox, по правилу: уда-
лить 2 символа, начиная с третьей позиции.
Решение. Решение можно выполнить в несколько операторов:
String aux; // объявить вспомогательную переменную
// занести строку listBox1 с номером 8, в строку aux
aux = listBox1.Items [8].ToString();
aux = aux.Delete (3, 2); // удалить из aux требуемые символы
Пример 11. Изменить строку aux по правилу: вставить в aux подстроку "Yes",
начиная с первой позиции.
Решение:
aux.Insert (0, "Yes");
Пример 12. Изменить строку aux по правилу: ограничить длину строки aux пятью
символами (откинуть лишние символы справа).
Решение:
int k = aux.Length(); // вычислить длину aux
if (k>5) // если длина aux больше 5
aux = aux.Substring(0, 5); // оставить 5 символов
Пример 13. Изменить строку aux по правилу: если строка aux оканчивается заданной
подстрокой "ов", то удалить эту подстроку, а затем поместить ее в список listBox2.
Решение:
//определить номер позиции – начало подстроки "ов"
int j = aux.LastIndexOf ("ов");
int k = aux.Length(); // вычислить длину aux
if (j!=(k-1)) // проверить, что подстрока в самом конце
{
aux = aux.Substring (0, j); // вырезать подстроку
listBox2.Items.Add (aux); // добавить к списку
}
Приведённые примеры помогут выполнить задания; могут непосредственно использоваться при решении заданий или быть слегка модифицированы.
51

Контрольные вопросы
A
1. Как получать числовое значение из строки элемента TextBox? ListBox?
ComboBox?
2. Каково назначение свойства Items элемента ListBox?
3. В каких целях можно использовать элемент ListBox?
4. Как обратиться к выделенной строке списка?
5. Каковы отличительные особенности компонента ListBox от ComboBox?
6. Как синхронизировать действия ListBox и ComboBox?
7.
Как скопировать данные из ListBox в ComboBox? Как скопировать наоборот?
Варианты задания
Тексты из TextBox (многострочный) или ListBox конвертировать и переписать в
массив соответствующего размера. Решить задачу. Результирующий массив переписать в
другой подобный компонент.
Вариант 1
,, , .
Дан массив
11i
ba b
ii k
k
, т. е.
аа а
01
,, b а b а b
00110
Построить новый массив
n
,, ,
bb b
01
по правилу
n
Вариант 2
,, , .
Дан массив
аа а
01
Все элементы данного массива, начиная с первого отрица-
n
тельного элемента, увеличить в 2 раза.
Вариант 3
В массиве чисел
аа а
01
найти
n
A
– максимальный элемент. Сформировать но-
max
,, , .
вый массив, в который поместить только те числа из массива а, которые по величине не пре-
вышают
max
.
2
52

Лабораторная работа № 12
Разработка приложения обработки матричных данных
в среде Microsoft Visual Studio
Цель работы: получить практические навыки в использовании компонентов DataGridView для отображения матриц в среде MS Visual Studio C#.
Методические указания
Сложные программы обрабатывают не только одиночные данные или массивы, но и
матрицы или табличные данные. Для визуализации таких данных на окне приложения в языке C# используется компонент DataGridView.
Компонент DataGridView
Компонент DataGridView служит для представления текстовых данных и данных
других типов в виде таблицы.
Очень часто в программах нужны сетки ввода
тронную таблицу Excel или Access. Ее окно построено на основе сетки ввода. Вы можете себе
представить электронную таблицу без такой сетки? Очевидно – нет. В MS Visual Studio C#
вам доступна сетка вида DataGridView. В DataGridView вы можете вводить данные
и они там будут сохраняться и отображаться.
Рассмотрим работу
с DataGridView. Основные свойства30 компонента для
DataGridView:
BorderStyle (Appearance) – стиль обрамления окна с сеткой. Здесь возможны ва-
рианты None, FixedSingle или Fixed3D. Можно самостоятельно по очереди установить
эти типы и посмотреть, что они собой представляют;
CellBorderStyle – стиль обрамления ячеек сетки. Есть несколько вариантов.
Можно самостоятельно по очереди установить эти типы и посмотреть, что они собой представляют, как отображаются;
ColumnCount (программа) – свойство, из которого можно узнать или задать коли-
чество колонок в таблице;
ColumnHeadersDefaultCellStyle (Appearance) – определяет формат по умолча-
нию ячеек, хранящих заголовки строк. Настройки аналогичны свойству DefaultCellStyle;
ColumnHeadersVisible (Appearance) – определяет, необходимо ли отображать
блок над таблицей с названиями колонок. Удобно отображать в таблицах типа финансовой
отчетности;
Columns (Misc) – поле, через которое осуществляется доступ к редактору колонок.
Из программы можно выполнять такие же действия и другое, пользуясь свойствами и методами этого поля (см. ниже);
DefaultCellStyle (Appearance) – определяет формат ячеек по умолчанию.
По кнопке справа вызывается диалоговое окно CellStyle Builder, в котором можно настроить
шрифт, выравнивание текста, цвет и другие параметры;
EditMode (Behavior) – определяет набор клавиш доступа к редактированию ячеек
при работе с программой;
Enabled (Behavior) – определяет, разрешено ли работать с таблицей в программе
или она заблокирована;
EnableHeadersVisualStyles (Appearance) – определяет, разрешено ли в заго-
ловках строк и колонках использовать стиль оформления, задаваемый пользователем;
ReadOnly (Behavior) – определяет, разрешено ли редактировать ячейки таблицы
или таблица используется только для просмотра данных;
30
Упомянуты свойства не только те, что отображаются на вкладке Property, но и доступные из программы.
данных. Например, взгляните на элек-
53

RowCount (программа) – свойство, из которого можно узнать или задать количе-
ство строк в таблице;
RowHeadersDefaultCellStyle (Appearance) – определяет формат по умолча-
нию ячеек заголовков строк. Настройки аналогичны свойству DefaultCellStyle;
RowHeadersVisible (Appearance) – определяет, необходимо ли отображать блок
перед таблицей. В ячейках этого блока бегает указатель и отображаются другие значки аналогично таблице в конструкторе таблиц в программе Access;
Rows (программа) – свойство, через которое можно устанавливать и опрашивать па-
раметры строк. В том числе обращаться к отдельным ячейкам таблицы (см. ниже);
ScrollBars (Layout) – определяет наличие полос прокрутки по сторонам таблицы.
Здесь перечислены основные свойства компонента DataGridView. При разработке
сложных приложений, в том числе и с применением баз данных, используются и другие.
Обращение к ячейкам компонента DataGridView
Компонент DataGridView служит для представления текстовых данных в виде таблицы. Но разработка мощного компонента привела к тому, что внутренняя структура полей
сложна и иногда несколько запутана по сравнению с обычными матрицами.
Нумерация строк и колонок в рабочей области таблицы (в области данных) начинается
с индекса 0, как в простой матрице. Чтобы прочитать или записать текст в/из ячейке(и) таблицы, необходимо указать номер строки и ячейки, обращаясь полям компонента и их подполям следующим образом:
dataGridView1.Rows[<индекс строки>].Cells[<индекс колонки>].Value
Но необходимо помнить, что при чтении и записи информации даже в текстовом виде
может потребоваться преобразование данных в соответствующий формат. Например, обращение к ячейкам таблицы с названием dGVMatr будет выглядеть как
label3.Text = dGVMatr.Rows[0].Cells[0].Value.ToString();
В то же время корректно будет
dGVMatr.Rows[1].Cells[1].Value = label2.Text;
dGVMatr.Rows[2].Cells[2].Value = 3.1415926;
Но при компиляции и тестировании программы необходимо внимательно контролировать, корректно ли выполняется преобразование.
Необходимо помнить, что при обращении к ячейкам следует быть в пределах размера таблицы 0 ⩽ <индекс колонки> ⩽ ColCount–1, 0 ⩽ <индекс строки> ⩽ RowCount–1, где свойства компонента: ColumnCount – количество столбцов, RowCount – количество строк. Необходимо также помнить, что обращение к неинициализированной ячейке (к пустой ячейке, в которую ни разу не заносили информацию) будет вызывать ошибку программы.
Заголовки строк и колонок таблицы компонента DataGridView
При формировании и отображении таблицы, в том числе и
матричных данных, пользо-
вателю было бы удобно знать, а какая колонка (или строка) содержит информацию. В стандартных таблицах, входящих в состав документов, каждая колонка и строка содержат наименование. При работе с матрицами тоже хотелось знать номер колонки и строки (подобно листам книги Excel).
Компонент DataGridView содержит в каждой колонке (и каждой строке) особое поле
HeaderCell – заголовочная ячейка. Информация (текстовая или иная) этого поля и служит
заголовком колонки/строки. Другими словами, внеся последовательные числа в эти заголовки, можно легко ориентироваться в нумерации ячеек большой матрицы. Пример обращения
к этим полям может быть следующий:
dGVMatr.Columns[i].HeaderCell.Value = 123.ToString();
54

dGVMatr.Rows[j].HeaderCell.Value = 234.56.ToString();
Обратите внимание, что в заголовок колонки/строки приходится закладывать текстовую информацию. Здесь примеры с целыми и вещественными константами. При отладке
программы необходимо проконтролировать настройки формата заголовочных ячеек и их
ширину, чтобы информация в них отражалась полностью.
Примеры использования компонента DataGridView
Для приобретения навыков обращения с компонентом табличных данных
DataGridView здесь приведены некоторые примеры.
1. Чтение целого числа из ячейки в строке i и в столбце j:
a[i][j] = Convert.ToDouble (dGVMatr.Rows[i].Cells[j].Value);
или, например
n = Convert.ToInt32 (dGVMatr.Rows[i].Cells[j].Value);
Необходимо помнить, что здесь, возможно, более подходящие функции типа
TryParse, для организации безопасного программирования, т. е. чтобы программа отлавливала ошибки преобразования из текста в число.
2. Запись в DataGridView элемента матрицы, расположенного в строке 3 и столбце 4:
dGVMatr.Rows[3].Cells[4].Value = 3.1415926;
dGVMatr.Rows[3].Cells[4].Value = a[3][4];
3. Если пользователь на интерфейсе программы в таблице выделил ячейку, то её адрес
можно узнать в программе:
irow = dGVMatr.CurrentCell.RowIndex;
jcol = dGVMatr.CurrentCell.ColumnIndex;
Здесь irow и jcol – индексы, например локальные переменные.
4. Определение количества строк и столбцов DataGridView:
n = dGVMatr.RowCount;
m = dGVMatr.ColumnCount;
dGVMatr.Rows[n-1].Cells[m-1].Value = ”Это последняя клетка таблицы”;
Это основные действия с ячейками таблицы. Этого во многих случаях достаточно для
работы с матрицами и другими математическими объектами.
Компонент NumericUpDown
Часто однострочный редактор используется для ввода чисел (одиночного числа). Если
это целое число, то в таких случаях более удобно использовать компонент NumericUpDow.
Внешне (на интерфейсе окна) это однострочный редактор, но имеющий пару кнопок на правом краю (или левом, при соответствующих настройках). С помощью этих кнопок изменять
значение числового поля можно и с помощью мыши. Помимо этого, значение можно увеличивать или уменьшать с помощью клавиш со стрелками на клавиатуре.
Основные свойства компонента для NumericUpDow:
DecimalPlaces (Data) – компонент NumericUpDown позволяет оперировать и с
вещественными числами, с шагом, заданным в поле Increment. Это поле позволяет установить, сколько знаков после запятой будет отображаться в окошке. Из кода программы можно
спрашивать и устанавливать значение. Значения в полях Increment, Maximum, Minimum,
Value могут быть вещественными.
55

Increment (Data) – поле, содержащее значение шага изменения значения, при
нажатии мышкой на кнопки справа или клавишами со стрелками на клавиатуре. Из кода программы можно спрашивать и устанавливать значение.
Maximum (Data) – поле, содержащее максимальное значение, которое можно уста-
новить в окошке. Из кода программы можно спрашивать и устанавливать значение.
Minimum (Data) – поле, содержащее минимальное значение, которое можно устано-
вить в окошке. Из кода программы можно спрашивать и устанавливать значение.
ThousandSeparator (Data) – поле, определяющее, надо ли разделять тысячи в
окошке при выводе больших чисел. Из кода программы можно спрашивать и устанавливать
значение.
Value (Appearance) – поле, содержащее значение, установленное в окошке. Из кода
программы можно спрашивать и устанавливать значение. Значение может быть произвольным. Отображаться будет в соответствии с форматом указанном в поле.
Простейший интерфейс для работы с матрицей представлен на рис. 1.
numericUpDown1
numericUpDown2
dataGridView1
textBox1
Рис. 1. Возможное расположение компонентов на форме
Здесь показаны надписи, которые среда генерирует автоматически. Естественно, для
формы, меток и кнопок желательно заменить надписи в полях Text в соответствии с проектом.
Управление колонками и строками в компоненте DataGridView не одинаково. Колонки можно создавать ещё на стадии проектирования, в том числе вписывать им имена.
Для этого в окне свойств
в параметре Columns можно вызвать редактор колонок, показанный
на рис. 2. Но все эти операции можно выполнять и из программного кода.
Рис. 2. Диалоговое окно для редактирования колонок
56

Но указание количества строк, запись их названий выполняются только программно.
Заполнение содержимым ячеек таблицы DataGridView тоже выполняется только из кода
программы.
Контрольные вопросы
1. В каких целях можно использовать элемент DataGridView?
2. Каковы основные свойства DataGridView?
3. В каких целях можно использовать элемент NumericUpDown?
4. Каковы основные свойства NumericUpDown?
Варианты задания
Для решения задачи использовать матрицу, значения которой формируются из содержимого компонента DataGridView. После решения задачи результат занести в компонент
DataGridView. Можно в другой экземпляр.
Вариант 1
Задана прямоугольная матрица. Вычислить и запомнить сумму и число положительных
элементов каждого столбца матрицы.
Вариант 2
Задана квадратная матрица. Найти в каждой строке наибольший элемент и поменять
его местами с элементами главной диагонали.
Вариант 3
Задана прямоугольная матрица. Найти наибольший и наименьший элементы матрицы и
поменять их местами.
57

Лабораторная работа № 13
Разработка полнофункциональных приложений в среде MS Visual Studio C#
Цель работы: получить основные навыки в использовании меню и стандартных диа-
логовых окон при разработке приложений.
Методические указания
Одним из основных элементов интерфейса Windows-программ является наличие у них
меню различного вида. Помимо этого, интерфейс может быть частично реализован в виде
графических элементов.
Создание меню
В приложениях, написанных на MS Visual (Builder, Delphi, RAD Studio и т. п.), могут
быть реализованы меню двух основных видов:
Главное меню (MainStrip). Такое меню принадлежит форме и отображается вместе с
ней под панелью заголовка окна. Если в приложении несколько форм, то для удобства можно
объединять меню всех активных форм в одном.
Всплывающее меню (контекстное, ContextMenuStrip). Подключение такого меню
предусмотрено почти у всех компонентов (т. е. свойство на стадии разработки). Во время работы программы такое меню возникает (всплывает) при нажатии правой кнопки мыши на
этом элементе (компоненте). Предусмотрено такое меню и у формы31.
Меню является иерархическими структурами (деревом), состоящими из пунктов меню.
Каждый пункт может быть выбран. Пункт меню может быть выбран вследствие или щелчка
кнопкой «мыши», или нажатия соответствующих «горячих» клавиш на клавиатуре, или
нажатия <Enter>, или вызова из процедуры в программе32.
На самом нижнем уровне в иерархии меню лежат команды меню – пункты, с которыми
связана та или иная процедура, реализующая реакцию приложения на выбор этого пункта
меню. Команды меню объединяются в подменю. Подменю – это пункты, выбор которых
позволяет открыть список пунктов меню или других подменю.
Каждый пункт меню является компонентом ToolStripMenuItem (нет на палитре
компонент). Каждый компонент ToolStripMenuItem имеет много свойств.
К ним относятся:
Checked – отмечен ли этот пункт меню галочкой;
Enabled – запрещает исполнение этого пункта;
Text – надпись на интерфейсе приложения;
Visible – указывает, является ли видимым этот пункт меню; если значение False,
то в меню нет строки с этим пунктом.
Здесь не упоминается ещё один тип – системное меню. Оно создается средой разработки одновременно с формой (окном) приложения. На левой стороне заголовочной строки
окна размещается кнопка (пиктограмма) для доступа к нему, как и его дублирующие команды под кнопками на правой стороне заголовочной строки.
Технология создания меню приложения
Практически все приложения Windows имеют свое меню – один из распространенных
элементов пользовательского интерфейса. Меню представляет собой список команд. Выбор
пункта меню инициирует выполнение некоторой команды. Конструировать и создавать на
форме полосу главного меню, а
также сопутствующие выпадающие меню в среде MS Visual
Studio, позволяет компонент MenuStrip (или ContextMenuStrip для контекстного меню).
31
Помимо главного меню.
32
Имеется в виду чисто программный вызов процедуры, прицепленной к пункту меню. Но можно программой
инициировать и «щелчок по пункту меню».
58

Процесс создания меню включает три-четыре шага:
1) помещение компонента MainMenu (PopupMenu) из палитры на форму;
2) вызов Дизайнера Меню и конструирование иерархического списка команд;
3) создание обработчиков событий для пунктов меню;
4) привязка к компоненту (только для контекстного PopupMenu).
Пункт 1. Размещение компонента меню
При помещении MainStrip (или ContextMenuSrip) на форму это выглядит, как
просто линейка меню вверху формы. Для доступа к редактору пунктов меню, внизу окна редактора дизайна появляется полоса с кнопками (рис. 1).
Рис. 1. Пример размещения компонентов MainStrip и ContextMenuStrip
Пункт 2. Конструирование списка команд
Вызов Редактора коллекции пунктов Меню (Items Collection Editor) осуществляется через свойство Items компонента MenuStrip в Инспекторе Объектов (на вкладке Property).
Определение структуры меню и его пунктов производится в Редакторе коллекции пунктов
Меню. Для открытия необходимо дважды щелкнуть на значении свойства Items, в поле, где
написано «(Collection)» или
по кнопке справа (рис. 2).
Рис. 2. Место вызова Редактора Меню
59

Можно воспользоваться контекстным меню по правой кнопке мыши и выбрать пункт
Edit Items…, как показано на рис. 3.
Рис. 3. Окно Редактора Меню для формирования разделов и пунктов меню
Появляется диалоговое окно. Пункты добавляются с помощью кнопки Add. Настройки
свойств пункта меню осуществляется в окне (редакторе свойств, Properties), в правом списке
свойств. На первых порах достаточно свойства Text, которое и определяет название пункта
на форме программы. По мере наполнения меню (разделов меню) названия будут отображаться и на форме программы в дизайнере формы (рис. 4).
Рис. 4. Фрагмент заполнения пунктов меню с помощью конструктора (дизайнера) меню
Переупорядочивание пунктов и удаление ошибочных выполняются с помощью кнопок
справа от списка. Если перед некоторой буквой в тексте названия команды (поле Text) поставить знак «&», то во время выполнения программы соответствующая буква будет изобра-
33
жаться с подчеркиванием. Эту букву можно использовать в качестве «горячей» клавиши
.
Но это будут названия разделов главного меню. Для формирования пунктов меню раздела необходимо его выбрать в левом списке, а в свойствах (в правом списке) выбрать пункт
DropDownItems. Также по кнопке справа вызвать второй экземпляр редактора меню и
формировать список уже пунктов раздела.
Иногда меню имеет более сложную структуру – пункты
меню имеют собственное подменю. Оно создается аналогично, т. е. в пункте DropDownItems по кнопке справа необходимо вызвать следующий экземпляр редактора меню34.
33
Хорошо работает на англоязычном приложении. При использовании кириллицы, русской раскладки на кла-
виатуре может не срабатывать.
34
То есть будет открыто несколько таких окон редактора одновременно.
60
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
