- •Лабораторные работы по курсу «Современные технологии и инструментарий программирования»
- •1.Программирование двусвязного списка на c#
- •1.1.Задание
- •1.2.Выбор каркаса приложения
- •1.3.Описание вариантов заданий
- •2.Приложение wForms с DataGridView на c#
- •2.1.Задание
- •2.2.Описание вариантов заданий
- •2.3.Сценарий разработки приложения
- •2.4.Как (бесплатно) получить путь к приложению
- •If(System.Io.File.Exists(Path)) /*есть*/; else /*нет*/;
- •3.Доступ к серверу Excel на c#
- •Сценарий выполнения работы
- •4.Класс матриц c#
- •4.1.Задание
- •5.Ассоциативные массивы на c#
- •5.1.Задание вкупе с ценными методическими указаниями
- •If(MyArr.Add("Охорона студента від викладача", "Тугодумко Петро", Mark)) /* Слава Україні!*/; else /* Вибачте, маячня!*/;
- •If(MyArr.Add("Хвілосохвія", "Розумниця Настя", new int [] {2,3,2})) /* Сало понад усе!*/; else /* Пробачте, нісенітниця!*/;
- •5.2.Варианты заданий для ритейла
- •6.Приложение «Тараканьи бега» (wpf с#)
- •6.1.Задание
- •6.2.Рисование простейших фигур на холсте
- •10, // Задержка перед вызовом функции обр. Вызова
- •200 // Интервал вызова функции обр. Вызова
- •7.Разработка простейшего приложения Windows Forms на c#
- •7.1.Задание
- •7.2.Бесценные методические предписания
- •Литература
- •7. Проект New_Syntax
- •8. Руководство_по_c#.Doc
2.3.Сценарий разработки приложения
Данный сценарий предполагает использование нерусифицированной среды MVS-2008, хотя не возбраняется и использование более поздних версий.
Шаг 1. Создание заготовки приложения. Запустите MVS-2008, выполните команду меню FileNewProject, соблаговолите выполнить установки в соответствии с рис.1. Имя проекта можно выбрать по своему усмотрению, но далее в сценарии предполагается, что его нарекли DGView.
|
Рис. 1. Выбор параметров каркаса приложения
После нажатия кнопаря ОК вы должны увидеть окно среды MVS-2008 примерно в таком обличье, как на рис. 2.
Шаг 2. И что же мы получили? Просмотрите файлы, имена которых представлены в окне Solution Explorer. Вот содержимое файла Program.cs с некоторыми комментариями:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace DGView
{
static class Program /* Класс с главной функцией Main(), с которой и
начинается выполнение программы. Имя класса (Program) произвольно, а вот имя функции Main() изменять не стоит */
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1()); /* Создается главное окно программы и,
собственно, начинается выполнение программы */
}
}
}
В простейшем случае вам не придется вносить изменения в этот файл (Program.cs).
|
Рис. 2. Первоначальный вид приложения DGView в среде MVS-2008
В файле AssemblyInfo.cs тоже мало интересного – разные атрибуты приложения. Смотреть смотрите, но не трогайте его.
Несомненный интерес представляет файл Form1.Designer.cs, в котором описан класс нашего, главного и единственного пока, окна приложения. Для того чтобы переключаться между собственно окном и классом с его описанием, можно использовать контекстное меню для компонента Form1.cs во вкладке Solution Explorer или переключаться между вкладками Form1.cs[Design] и Form1.Designer.cs в окне редактирования.
Щелчок по имени файла Form1.cs в окне Solution Explorer просто активирует само окно (в данном случае с заголовком Form1) и толкает нас к тому, чтобы мы в это окно что-нибудь поместили, типа как «поставили на подоконник». Для того чтобы посмотреть на содержимое самого файла, надо вызвать для него (файла) контекстное меню и в нем выбрать команду View Code. Просмотрите и проанализируйте содержимое этого файла, но лучше ничего в нем не изменяйте, по крайней мере пока.
Постройте приложение (F7), убедитесь в отсутствии ошибок и предупреждений. Запустите его на выполнение (F5), потаскайте окно, поизменяйте его размеры, делайте с ним все, что хотите, оно должно вытерпеть.
Шаг 3. Как добраться до свойств окна. Щелкните по имени файла Form1.cs в окне Solution Explorer (или по вкладке с заголовком Form1.cs[Design]), поместите курсор мыши в клиентскую область окна, вызовите контекстное меню и в нем выберите команду Properties. Появится окно со свойствами вашего окна. Просмотрите их, можете, так и быть, изменить свойство Text, которое определяет заголовок окна.
Давайте действия типа «Щелкните по имени файла Form1.h в окне Solution Explorer (или по вкладке с заголовком Form1.cs[Design])» назовем «переходом в режим дизайна окна», а?
Шаг 4. Добавление в приложение главного меню. Перейдем в режим дизайна окна, с помощью команды ViewToolbox вызовем окно с управляющими элементами, найдем в нем группу «Menus & Toolbars», и в ней выберем элемент MenuStrip («полоса меню» по-нашему) путем щелчка ЛКМ по нему. Переместим мышь в верхнюю часть нашего окна и «растянем» в нем прямоугольник. Путем «интуитивно понятных» манипуляций введем тему меню «Файл» (рис. 3), а в ней команды «Открыть», «Сохранить» и «Выход».
|
Рис. 3. Добавление меню «Файл» и его команд
Замечание. Если добавить в окно полосу меню MenuStrip и вызвать для нее контекстное меню, то в нем есть, в частности, команда Insert Standart Items, с помощью которой можно добавить в приложение «стандартное меню»: File, Edit, Tools, Help.
|
Рис. 4. Вид меню «Файл» и его команд
Запустите приложение на выполнение, вызовите команды меню «Файл» и убедитесь, что они ничего не делают.
В файле Form1.Designer.cs вы обнаружите имена тем меню, начинающиеся с символов кириллицы (файлToolStripMenuItem и т.п.). Я их переименовываю (FileToolStripMenuItem и т.п.) с помощью команды RefactorRename контекстного меню и вам рекомендую сделать то же самое.
Шаг 5. Добавление обработчиков команд главного меню. Перейдем в режим дизайна окна, выберем нужную команду меню, сделаем двойной щелчок мышью по команде меню и получим заготовку обработчика этой команды (в файле Form1.cs):
namespace DGView
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void OpenToolStripMenuItem_Click(object sender,
EventArgs e)
{
int num = 123;
this.Text = Convert.ToString(num); /* вывод 123 в заголовок
окна приложения */
return;
}
}
}
В обработчик команды меню «Выход» достаточно добавить вызов функции Close(), которая закрывает главное окно приложения и тем самым его завершает.
Обратите также внимание на то, что в файле Form1.cs есть участки кода, помеченные директивами компилятора, например:
#region Windows Form Designer generated code
// сгенерированный дизайнером программный код
#endregion
Такие фрагменты программного кода сгенерированы дизайнером форм и их ни в коем случае не стоит редактировать с помощью обычного редактора. Можете убедиться сами.
Шаг 6. Добавление на форму управляющих элементов. Теперь давайте осчастливим пользователя возможностью ввести два целых числа, выполнить их умножение и лицезреть результат.
Для этого перейдем в режим дизайна окна, вызовем окно Toolbox и из группы управляющих элементов Common Controls выберем три элемента TextBox (для двух операндов и результата) и кнопку Button для выполнения операции умножения и красиво разместим их на форме (рис. 5).
|
Рис. 5. Форма с элементами управления
Я думаю, вы догадаетесь, как на кнопке разместить подходящую надпись. Двойной шлепок по кнопке заставит ИС сгенерировать для нее обработчик события, который мы наполним таким кодом:
private void button1_Click(object sender, EventArgs e)
{
int a,b,c;
a=Convert.ToInt32(this.textBox1.Text);
b=Convert.ToInt32(this.textBox2.Text);
c=a*b;
this.textBox3.Text=Convert.ToString(c);
}
Запустите приложение на выполнение, введите два числа, нажмите кнопарь и проверьте корректность результата. Получается? А теперь попробуйте ничего не вводить или введите целое число в недопустимом формате и нажмите кнопочку. Что произошло, никак ошибочка? Доработайте программный код так, чтобы ошибки не было. Вот один из вариантов контроля ввода числовых данных пользователем:
|
Разберитесь в приведенном коде, а не просто копируйте, не приходя в сознание.
Кроме того, доработайте интерфейс программы таким образом, чтобы он был менее недружественным к пользователю: в частности, добавьте надписи к элементам ввода данных и представления результата (Label).
Шаг 7. Добавление на форму ленты инструментов (ToolStrip). Итак, мы уже умеем снабжать форму меню, кнопками, элементами ввода TextBox и надписями Label, генерировать обработчики событий и наполнять их кодом. Казалось бы, что еще нужно для счастья? Верно – ToolStrip.
Найдем его в оконце Toolbox и перетащим в окно, чуть пониже полосы меню (рис. 6). Для того чтобы понять, что за гусь «лента инструментов», подгоните мышь к маленькому черному треугольнику в правой части панели ToolStrip, щелкните по нему ЛКМ и в выпавшем меню выберите команду Insert Standard Items.
|
Рис. 6. Окно с заготовкой ленты инструментов
Теперь лента инструментов приняла вид, представленный на рис. 7. Я думаю, вы уже скумекали, что такое ToolStrip.
|
Рис. 7. Лента инструментов со «стандартными» кнопками
Не исключено, что некоторые (или все) кнопки на ленте ToolStrip вам не нужны. Тогда загоните мышь на свободное место ленты, с помощью ПКМ вызовите контекстное меню и вызовите в нем команду Edit Items. Результатом этих героических усилий станет появление окна (рис. 8), с помощью которого вы сможете добавлять, удалять и перемещать кнопки ToolStripButton. В правой части этого окна отображаются свойства выбранной кнопки. В частности, свойство Image позволяет загрузить рисунок (bitmap), который и будет идентифицировать кнопку. Размер рисунка на кнопке можно узнать из свойства Size, в данном случае это 23х22 пикселя. Обычно рисунок на кнопке сохраняется в файле .bmp с глубиной цвета 24 бита.
Файлы с рисунками, располагаемыми на кнопках, можно найти по пути C:\Program Files\Microsoft Visual Studio 9.0\VC\VCWizards\AppWiz\MFC\Application\templates\1033. Например, файл tbdh_256.bmp содержит изображения, представленные на рис. 9. Если вам понадобятся, например, изображения кнопок влево, вправо, переход в начало и т.д., вы их можете получить путем «вырезания» из рисунка.
|
Рис. 8. Окно конфигурирования ленты инструментов
|
Рис. 9. Файл tbdh_256.bmp
Шаг 8. Как использовать уже имеющийся обработчик некоторого события. В очень многих приложениях считается хорошим тоном дублировать команды меню кнопками на панели (или ленте) инструментов. Например, мы уже создали обработчик команды «Открыть» меню «Файл» и он имеет имя OpenToolStripMenuItem_Click. Теперь мы добавили кнопку «Открыть» и хотим привязать к ней уже имеющийся обработчик. Вызовите окно свойств для кнопки, выберите в нем вкладку Events (кнопка с изображением молнии) и в выпадающем списке значений свойства Click выберите имя подходящего обработчика, в данном примере OpenToolStripMenuItem_Click.
Шаг 9. Как открыть и прочесть текстовый файл. Выбрать имя файла с помощью стандартного диалога поможет класс OpenFileDialog. Для достижения этой несомненно благородной цели достаточно в обработчик команды меню OpenToolStripMenuItem_Click добавить приведенный ниже код. Кроме того, опробуем заодно и чтение текстового файла по записям, пока в примитивном виде, для чего надо подключить пространство имен System.IO. Это значит, что в начало файла Form1.h к многочисленным директивам using namespace надо добавить еще одну:
// файл Form1.cs
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;
using System.IO; // добавить для обработки файлов
Обработчик команды меню OpenToolStripMenuItem_Click наполним таким кодом:
|
Введите приведенный код, добейтесь его компиляции, установите точку прерывания на операторе input="", запустите приложение на выполнение, вызовите команду меню ФайлОткрыть, выберите какой-нибудь текстовый файл и убедитесь в том, что все его записи читаются, просматривая значение переменной input на каждом шаге цикла. Получилось?
Шаг 10. Добавление в приложение собственного совершенного класса. Выполните команду меню ProjectAdd class, в появившемся окне выберите категорию Code и шаблон Class, в поле Name введите Employee и натисните кнопку Add. В данном примере член-данные класса описаны как свойства, хотя слово property и не использовано (по причине отсутствия в C#).
В качестве имени пространства имен мастеровой от ИС предложил использовать все то же DGView, но вы можете на это начхать и предложить нечто свое свеженькое. Ваш класс будет сохраняться в файле Employee.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DGView
{
public class Employee
{
private String vName; // имя
private double vParms; // некоторый параметр
private int vAge; // возраст в годах
// Свойства для доступа к личным атрибутам:
public String Name
{
get{return vName;}
set{vName=value;}
}
public double Parms
{
get { return vParms; }
set { vParms = value;}
}
public int Age
{
get { return vAge; }
set { vAge = value; }
}
}
}
Для того чтобы класс стал «виден» в проекте, надо сделать ... что? А ничего, если вы в предыдущем файле Employee.cs не изменили предложенное мастером имя пространства имен DGView, которое уже использовано в проекте.
Шаг 11. Чтение текстового файла и создание списка объектов. Теперь попробуем создать текстовый файл с данными некоторого числа объектов класса Employee, прочесть его и разместить данные в списке. Размещать прочитанные данные удобнее было бы в массиве, но, во-первых, мы не знаем заранее число записей файла, и, во-вторых, мы можем возжелать добавить клиентов в список или наоборот.
С помощью редактора ИС MVS-2008 создадим текстовый файл Emp.txt с таким наполнением:
-
Обама 12,3 53
Меркель 13,4 60
Кэмерон 14,5 48
Обратите внимание, что разделителями полей записи (строка, вещественное и целое числа) текстового файла должен служить ровно один пробел. Файл надо сохранить в кодировке Unicode для того, чтобы не было проблем с символами кириллицы. Для этого выполним команду FileAdvanced Save Options и в появившемся оконце (рис. 11) изберем кодировочку Unicode 65001.
|
Рис. 11. Выбор кодировки Unicode
Определим свой список MyList на основе шаблонного класса List и поместим его определение в класс Form1 (файл Form1.cs):
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
List <Employee> MyList = new List <Employee>(); // Бачиш куди?
Доработаем обработчик команды Файл/Открыть следующим манером:
|
Введите приведенный программный код, откомпилируйте и устраните ошибки, в режиме трассировки просмотрите значения элементов списка, т.е. член-данных объектов класса Employee и воочию убедитесь в работоспособности программы на этом этапе.
Шаг 12. Отображение данных на форме. К этому моменту у нас есть список объектов класса Employee, но счастливый обладатель нашей программулины пока не имеет возможности просматривать данные или выполнять над ними какие-либо другие правомерные действия.
Мы бы могли добавить в окно формы управляющие элементы, предназначенные для отображения член-данных одного объекта. В нашем простейшем случае достаточно разместить на форме три элемента TextBox и, соответственно три Label для пояснения отображаемых данных. Несомненно, надо бы добавить еще один элемент, который будет показывать номер (индекс) отображаемого элемента списка. На ленту ToolStrip необходимо было бы добавить красивые кнопочки, предназначенные для перемещения по элементам списка, их удаления, вставки и т.д. в полном соответствии со своим индивидуальным заданием и вашими совершенно добровольными «примочками».
Все это можно, но вы так делать не хотите, а хотите добавить сразу таблицу. Ну что ж, как говорится, любой каприз за ваши деньги. Добавьте на форму элемент DataGridView, вызовите его окно свойств, добавьте три колонки, задайте для них надписи в заголовке таблицы и имена (рис. 12). В данном сценарии выбраны имена FName, Param и Age. Тип всех колонок – DataGridViewTextBoxColumn. Заданные и выбранные по умолчанию свойства таблицы вы можете посмотреть в файле Form1.Designer.cs.
Сделайте и перебегайте к следующему шагу.
|
Рис. 12 Управляющий элемент DataGridView
Шаг 13. Заполнение таблицы данными объектов, размещенных в списке MyList. В простейшем виде, безо всяких проверок, это можно сделать так, как в приведенной ниже функции FillDataGrid().
|
Вызов этой функции можно добавить ... Да это элементарно, вы уже и так давно догадались, куда!
Шаг 14. Наконец-то самостоятельная работа, ура!
Когда (счастливый?) пользователь вашей программы будет редактировать, удалять, вставлять, перемещать объекты, он захочет, естественно, и сохранять полученные с таким трудом результаты в файле. Для этого вы напишите обработчики команд «Сохранить» и «Сохранить как ...» меню «Файл», которые для случая нашего подопытного класса может выглядеть примерно так, как показано ниже.
|
Очевидно, что сначала надо осчастливить юзера возможностью добавлять новые записи в таблицу или удалять «испортившиеся». Для этого вы, скорее всего, добавите тему главного меню «Редактирование», в ней – команды «Удалить» и «Добавить». Удалить текущую запись можно оператором
dataGridView1.Rows.Remove(dataGridView1.CurrentRow);
а добавить новую запись в конец таблицы – оператором
dataGridView1.Rows.Add();
А можно удалить запись с помощью клавиши Del?
И для коня очевидно, что после удаления, редактирования или добавления строки в таблицу надо обновить список, так как именно его мы записываем в файл.
