C#. Курсовая работа. Разработка программы ведения учета материальных средств. База данных Microsoft Access

C#. Курсовая работа. Разработка программы ведения учета материальных средств. База данных Microsoft Access

В курсовой работе описывается пошаговый процесс создания программы учета материальных средств (инвентаризация). Представлен подход к проектированию приложения, которое взаимодействует с базой данных на автономном уровне с использованием средств Microsoft Visual Studio.

Используя данный пример, Вы сможете создавать собственные приложения, которые оперируют базами данных Microsoft Access, используя средства MS Visual Studio. Пример, который демонстрируется в данной теме, также может подойти для оперирования базами данных других провайдеров, например, Microsoft SQL Server, Oracle и т.д. поскольку работа с компонентами на автономном уровне, ничем не отличается от работы, описанной в данной теме.

Похожие курсовые работы на C#:

Данная работа демонстрирует наличие мощных средств для работы с базами данных в MS Visual Studio. Взаимодействие между визуальными элементами управления и базой данных реализуется с помощью соответствующих настроек, без программного формирования SQL-запросов. Это, в свою очередь, минимизирует написание программного кода, поскольку вся работа по выводу информации и обработке таблиц базы данных выполняется системой.


Содержание



Условие задачи

Разработать программу для ведения автоматизированного учета материальных средств. Базу данных использовать Microsoft Access. Программа (приложение) должно быть создано по шаблону Windows Forms Application.

База данных предварительно создана средствами Microsoft Access и имеет название Account. Архив с файлом базы данных Account.mdb можно загрузить здесь.

База данных Account состоит из двух таблиц Worker и Account. Таблица Worker описывает общие данные о работнике предприятия или организации. Таблица Account описывает перечень материальных ценностей, которые числятся за конкретным работником. Таблицы связаны между собой по полю ID_Worker.

Структура таблицы Worker.

Базы данных Структура таблицы Worker

Структура таблицы Account.

Базы данных. Структура таблицы Account

Схема связи между таблицами изображена на рисунке 1.

Microsoft Access Схема связей между таблицами

Рис. 1. Схема связей между таблицами

 

Дополнительная информация

Отображение таблиц базы данных и взаимодействие с пользователем осуществляются с помощью элемента управления DataGridView.

После связывания таблицы с базой данных система формирует три объекта с именами

  • DataBaseNameDataSet
  • TableNameBindingSource
  • TableNameTableAdapter

где

  • префикс DataBaseName… – имя базы данных. В нашем случае для базы данных Account формируется имя accountDataSet;
  • префикс TableName… – имя таблицы в базы данных. В нашем случае для таблицы Worker будет сформировано два объекта с именами workerTableAdapter, workerBindingSource.

Большая часть работ по настройке и организации взаимодействия с базой данных осуществляется именно с помощью этих объектов. Основная идея данной курсовой работы состоит в максимальном использовании возможностей этих объектов. Как будет показано ниже, не нужно подключать пространство имен System.Data.OleDb, так как всю рутинную работу берет на себя интерфейс объектов Microsoft Visual Studio.

 

Выполнение

1. Создание проекта

Запустить MS Visual Studio. Создать приложение по шаблону Windows Forms Application. Подробный пример создания приложения по шаблону Windows Forms Application описывается в теме:

Создание нового проекта осуществляется командой

File->New Project...

В окне «New Project» задаются следующие настройки (рисунок 2):

  • в поле «Installed Templates» нужно выбрать «Visual C#»;
  • в перечне шаблонов Visual C# выбирается Windows Forms Application;
  • в поле «Location:» нужно указать папку, в которой будет размещаться проект (с помощью кнопки «Browse…». Например «D:\Programs\C_Sharp\Oblik01»;
  • в поле «Name:» нужно указать название новосозданного проекта. В нашем случае это Oblik01.

Microsoft Visual Studio создание проекта

Рис. 2. Окно настроек при создании проекта

После выбора «OK» будет создана новая форма приложения с именем Form1.

 

2. Подключение базы данных «Account.mdb» к приложению

На этом этапе нужно скопировать базу данных «Account.mdb» в папку, в которой размещаются файлы проекта. Архив с раньше созданным файлом базы данных можно загрузить здесь.

В нашем случае после копирования файл базы данных может иметь следующее полное имя:

D:\Programs\Oblik01\Account.mdb

или

D:\Programs\Oblik01\Oblik01\Account.mdb

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

Подключение файла базы данных происходит по принципу мастера. В пошаговом процессе при выборе таблиц базы данных нужно выбрать все таблицы (Worker, Account) и просмотры (AccountQuery, AccountQueryCalc, QueryWorker).

Имя источника данных остается по умолчанию – AccountDataSet.

После подключения файла базы данных к приложению вид окна Server Explorer будет иметь вид, как показано на рисунке 3.

MS Visual Studio база данных Account.mdb

Рис. 3. Окно утилиты Server Explorer после подключения базы данных Account.mdb

 

3. Проектирование главной формы приложения

На данный момент есть пустая форма приложения и подключение к базе данных Account.mdb. Имя формы по умолчанию Form1.

 3.1. Настройка общих свойств главной формы Form1

Чтобы настроить общие свойства формы нужно активировать (выделить) форму и в окне Properties (клавиша F4) выполнить соответствующие действия. Настраиваються следующие свойства формы:

  • свойство Text = «Inventory accounting» (рисунок 4);
  • во вкладке Size свойство Width = 800;
  • во вкладке Size свойство Height =600;
  • свойство MaximizeBox = False. Кнопка перевода из развернутого в обычный режим исчезнет.

C# Windows Forms Настройка свойств формы Form1

Рис. 4. Настройка свойств формы Form1

 

3.2. Проектирование меню. Элемент управления MenuStrip

На этом этапе проектируется меню команд главной формы приложения. Чтобы создать меню нужно использовать элемент управления MenuStrip. После размещения на форме создается объект menuStrip1, который соответствует главному меню (рисунок 5).

C# Windows Forms Элемент управления MenuStrip

Рис. 5. Элемент управления MenuStrip

В данной теме подробности разработки меню опускаются. Более подробный пример создания главного меню описывается в теме:

В меню создается перечень команд, как показано на рисунках 6-7.

C# Компонент Menu Strip Перечень команд меню Worker

Рис. 6. Перечень команд меню Worker

Меню Worker содержит команды добавления, удаления и редактирования таблицы Worker.

C# Компонент MenuStrip Перечень команд меню Inventory

Рис. 7. Перечень команд меню Inventory

Меню Inventory содержит команды добавления, удаления и редактирования таблицы Account.

 

3.3. Размещение элементов управления типа Label, Button, TextBox, DataGridView на форме

Из панели инструментов Toolbox выбрать и разместить следующие элементы управления:

  • три элемента управления типа Label для отображения информационных сообщений. Автоматически будет создано три объекта с именами label1, label2, label3;
  • шесть элементов управления типа Button для быстрого вызова команд меню. Автоматически будет создано шесть объектов с именами button1, button2, button3, button4, button5, button6;
  • один элемент управления TextBox. Здесь будет отображаться текст фильтра для вывода таблицы Worker. Создается объект с именем textBox1;
  • два элемента управления типа DataGridView. Создается два объекта с именами dataGridView1, dataGridView2. Эти объекты предназначены для отображения данных в таблицах Worker и Account.

После размещения элементов управления форма будет иметь приблизительный вид как изображено на рисунке 8.

C#. Windows Forms главная форма приложения

Рис. 8. Вид главной формы приложения после размещения элементов управления

 

3.4. Настройка элемента управления dataGridView1, соответствующего таблице Worker (настройка отображения таблицы Worker)
3.4.1. Подключение таблицы Worker базы данных

Подключение таблицы Worker к приложению происходит стандартным способом. Таблица Worker будет отображаться в элементе управления dataGridView1.

Для запуска процесса подключения нужно сначала активировать dataGridView1. Потом выбрать стрелку вправо как показано на рисунке 9. Отобразится меню «DataGridView Tasks».

C# Windows Forms Меню DataGridView Tasks элемент управления dataGridView

Рис. 9. Меню DataGridView Tasks элемента управления dataGridView1

В меню «DataGridView Tasks» нужно активировать нисходящее подменю «Choose Data Source:» и раскрыть список источников данных как показано на рисунке 10. В списке выбрать таблицу Worker.

C# Windows Forms. источник данных AccountDataSet таблица Worker

Рис. 10. Выбор источника данных AccountDataSet и таблицы Worker

После выбора таблицы Worker окно элемента управления dataGridView1 будет отображать названия полей таблицы Worker (рисунок 11). Также создается три объекта accountDataSet, workerBindingSource, workerTableAdapter для организации взаимодействия с таблицей Worker базы данных и ее отображения в dataGridView1.

C# Windows Forms Вид dataGridView1

Рис. 11. Вид dataGridView1 после выбора источника данных (таблица Worker). Объекты accountDataSet, workerBindingSource, workerTableAdapter

 

3.4.2. Элементы управления accountDataSet, workerBindingSource, workerTableAdapter

На рисунке 11 видно, что система создаст три объекта accountDataSet, workerBindingSource, workerTableAdapter после выбора источника данных. Источником данных есть таблица Worker. С помощью этих объектов можно организовывать взаимодействие с таблицей Worker базы данных (будет показано ниже).

Если теперь запустить приложение на выполнение, то можно увидеть, что данные таблицы Worker отображаются в dataGridView1.

 

3.4.3. Изменения в обработчике события Load главной формы. Текст метода Form1_Load()

После выбора источника данных в dataGridView1, изменяется код обработчика события Form1_Load(), который вызывается при загрузке формы. Текст обработчика события следующий:

private void Form1_Load(object sender, EventArgs e)
{
    // TODO: This line of code loads data into the 'accountDataSet.Worker' table. You can move, or remove it, as needed.
    this.workerTableAdapter.Fill(this.accountDataSet.Worker);
}

Вызывается метод Fill() объекта workerTableAdapter. В дальнейшем этот метод будет использоваться для отображения данных из таблицы Worker в элементе управления dataGridView1.

 

3.4.4. Настройка вида столбцов элемента управления dataGridView1

На этом шаге настраивается внешний вид dataGridView1.

Система Microsoft Visual Studio дает довольно широкий спектр возможностей для настройки таблицы, которая отображается в DataGridView. Можно настроить следующие основные визуальные элементы:

  • названия столбцов таблицы;
  • шрифт столбцов таблицы;
  • цвет фона и текста столбцов таблицы;
  • шрифт заголовков каждого столбца таблицы;
  • цвет фона и текста заголовков таблицы;
  • способы выравнивания в ячейках таблицы;
  • способы выравнивания в заголовках таблицы;
  • возможность отображения (скрытия) заданных столбцов таблицы;
  • другие дополнительные возможности.

В нашем случае нужно настроить следующие общие свойства dataGridView1:

  • свойство MultiSelect = False (запретить выделение нескольких строк);
  • ReadOnly = True. Запрещается редактировать ячейки dataGridView1 непосредственно. Изменение значений в ячейках будет происходить через специальные окна (формы);
  • AllowUserToDeleteRows = False. Запрещается удалять строки клавишей Del;
  • SelectionMode = FullRowSelect. Выделяется целая строка, а не отдельная ячейка строки.

 

3.4.4.1. Групповая настройка заголовков всех столбцов. Свойство ColumnHeadersDefaultCellStyle

Групповая настройка параметров заголовков всех столбцов осуществляется с помощью свойства ColumnHeaderDefaultCellStyle. Это свойство используется, если несколько столбцов таблицы имеют единые требования к оформлению (например, шрифт, цвет текста, выравнивание).

Если нужно индивидуально нстроить вид нужных столбцов, тогда в MS Visual Studio используется специальное окно Edit Columns (см. следующий пункт).

Это свойство позволяет настроить по умолчанию вид всех заголовков столбцов в таблице DataGridView (рисунок 12).

C# Windows Forms Свойство ColumnHeadersDefaultCellStyle

Рис. 12. Свойство ColumnHeadersDefaultCellStyle

Чтобы настроить свойство ColumnHeadersDefauleCellStyle нужно:

  • активировать элемент управления dataGridView1;
  • выбрать кнопку «…» напротив свойства ColumnHeadersDefaultCellStyle (рисунок 12). В результате откроется стандартное окно CellStyleBuilder (рисунок 13).

C# Windows Forms Окно "CellStyle Builder" Настройка вида ячеек

Рис. 13. Окно «CellStyle Builder». Настройка вида ячеек

Для заголовка, в этом окне можно использовать следующие свойства:

  • BackColor – цвет фона;
  • Font – шрифт текста. При выборе кнопки «…» открывается стандартное окно Windows для выбора нужного шрифта;
  • ForeColor – цвет шрифта;
  • Format – формат вывода цифровых значений. Предлагаются различные форматы представления чисел в ячейках: NoFormatting, Numeric, Currency, DateTime, Scientific, Custom. В нашем случае заголовки столбцов содержат только текст, поэтому это свойство изменять не нужно;
  • Alignment – выравнивание текста в заголовке по горизонтали и вертикали;
  • Padding – отступ в пикселах между текстом и рамкой, в которой этот текст вписывается.

В нижней части окна есть группа Preview. В группе Preview можно пересматривать текущее отображение ячеек в режиме «на лету».

В нашем случае нужно настроить следующие свойства ColumnHeadersDefaultCellStyle:

  • свойство Alignment = MiddleCenter;
  • свойство Font.Bold = true.

 

3.4.4.2. Задание шаблона DefaultCellStyle для обобщенного отображения данных в столбцах dataGridView1

Свойство DefaultCellStyle (рисунок 14) позволяет задать общие (общие для всех) настройки для ячеек (строк) всех столбцов таблицы, которые отображаются в DataGridView. Если некоторые строки имеют другие (отличные) настройки, то их можно изменить в индивидуальном порядке (см. следующий пункт).

C# Windows Forms Элемент управления dataGridView Вызов свойства DefaultCellStyle

Рис. 14. Вызов свойства DefaultCellStyle

Работа по настройке свойства DefaultCellStyle точно такая же как со свойством ColumnHeadersDefaultCellStyle, которое описывается в предыдущем пункте. Поэтому, рассматривать это свойство дополнительно не имеет смысла.

 

3.4.4.3. Настройка вида заданного столбца таблицы

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

Чтобы вызвать окно «Edit Columns» нужно выполнить следующие действия (рисунок 15):

  • активировать элемент управления dataGridView1. Откроется контекстное меню;
  • в контекстном меню выбрать команду «Edit Columns…».

C# Windows Forms Элемент управления dataGridView

Рис. 15. Вызов окна Edit Columns

После вызова окно «Edit Columns» имеет вид, как показано на рисунке 16.

C# Windows Forms Элемент управления dataGridView настройка столбца

Рис. 16. Окно настройки каждого столбца в отдельности

В списке «Selected Column:» (левая часть окна) отображается список полей таблицы, которая отображается в dataGridView1. В списке «Bound Column Properties» для каждого выбранного поля отображается перечень доступных свойств и их значений.

По умолчанию, для всех столбцов (полей) таблицы устанавливаются значения, которое были настроены в свойствах ColumnHeadersDefaultCellStyle (см. предыдущий пункт). В окне «Edit Columns» настраиваются только те параметры заголовка столбца, которые являются уникальными.

Для каждого столбца окно «Edit Columns» предлагает следующие основные свойства:

  • DefaultCellStyle – задает основные параметры для ячеек (строк) столбца (шрифт, цвет фона, выравнивание). Для настройки данного свойства вызывается специальное окно CellStyle Builder, работа с которым подробно описывается в предыдущем пункте (Групповая настройка …).
  • HeaderText – текст заголовка, который будет отображаться в таблице;
  • Visible – определяет, отображается ли столбец в DataGridView;
  • MaxInputLength – максимальное количество символов, которые можно ввести в ячейках (строках) столбца;
  • ReadOnly – определяет, можно ли непосредственно редактировать значения ячеек в DataGridView;
  • Resizeable – определяет, можно ли изменять ширину колонки непосредственно в DataGridView (с помощью «мышки»);
  • Name – имя объекта (переменной), которое соответствует данному столбцу. Это имя используется в программном коде;
  • ColumnType – тип колонки. Система MS Visual Studio предлагает разные типы представления столбцов. Наиболее распространенным есть представление ячеек столбца в виде строк ввода TextBoxDataGridViewTextBoxColumn;
  • AutoSizeMode – определяет, изменяется ли (расширяется) ширина столбца, если текст в строке столбца (в пикселах) имеет большую ширину чем задано в свойстве Width. Например, свойство есть полезным, когда нужно полностью отобразить текст в столбце без его урезания;
  • DividerWidth – дополнительная ширина границы (в пикселах) между заданным столбцом и столбцом, который отображается с правой стороны от данных.
  • MinimumWidth – минимально допустимая ширина столбца в пикселах;
  • Width – ширина столбца в пикселах.

В нашем случае нужно установить значение следующих свойств:

  • в столбце ID_Worker свойство Visible = False. Поскольку поле ID_Worker используется для связывания таблиц, то отображать его не имеет смысла;
  • в столбце WName свойство HeaderText = «Name of worker»;
  • в столбце WName свойство AutoSizeMode = AllCells. Теперь ширина столбца WName будет подстраиваться под ширину строки, которая имеет максимальную ширину (в пикселах) среди всех строк;
  • в столбце WPosition свойство HeaderText = «Position»;
  • в столбце WPosition свойство AutoSizeMode = AllCells;
  • в столбце WSex свойство HeaderText = «M/F»;
  • в столбце WSex свойство AutoSizeMode = AllCells;
  • в столбце WSex свойство DefaultCellStyle.Alignment = MiddleCenter.

 

3.5. Настройка элемента управления dataGridView2, который соответствует таблице Account (настройка отображения таблицы Account)
3.5.1. Связывание таблицы Account и dataGridView2

Связывание таблицы Account с dataGridView2 осуществляется точно так же как и для таблицы Worker, что описывается в п. 3.4.1. Нужно сначала активировать dataGridView2. Затем выбрать стрелку вправо. В окне «DataGridView Tasks» в поле «Choose Data Source:» нужно выбрать

Other Data Sources -> Project Data Sources -> AccountDataSet -> Account

как показано на рисунке 17.

MS Visual Studio. C# Windows Forms Выбор таблицы Account в окне DataGridView Tasks

Рис. 17. Выбор таблицы Account в окне DataGridView Tasks

После выбора таблицы Account, поля этой таблицы отобразятся в окне dataGridView2. Так же создается два новых объекта accountBindingSource и accountTableAdapter (рисунок 18).

C# окно формы таблица Account dataGridView элемент управления

Рис. 18. Вид окна формы после подключения таблицы Account к dataGridView2

 

3.5.2. Объекты accountDataSet, accountBindingSource, accountTableAdapter

Как и в случае с таблицей Worker (см. п. 3.4.1), После выбора таблицы Account в качестве источника данных создается еще два объекта (рисунок 18):

  • accountBindingSource – связывает непосредственно таблицу базы данных с набором данных AccountDataSet (здесь Account — название базы данных а не таблицы);
  • accountTableAdapter – используется для непосредственного программного управления данными в таблице (добавление строк, столбцов и т.п.).

Объект accountDataSet есть общим для объектов таблиц Worker и Account: workerBindingSource, workerTableAdapter, accountBindingSource, accountTableAdapter. Возможен также вариант, когда для таблиц создаются разные объекты типа DataSet.

 

3.5.3. Изменения в обработчике события Load главной формы. Текст метода Form1_Load()

После связывания таблицы Account с dataGridView2 в тексте обработчика события Form_Load() добавляется еще один метод Fill().

Общий вид обработчика события Load главной формы Form1 следующий:

private void Form1_Load(object sender, EventArgs e)
{
    // TODO: This line of code loads data into the 'accountDataSet.Account' table. You can move, or remove it, as needed.
    this.accountTableAdapter.Fill(this.accountDataSet.Account);

    // TODO: This line of code loads data into the 'accountDataSet.Worker' table. You can move, or remove it, as needed.
    this.workerTableAdapter.Fill(this.accountDataSet.Worker);
}

 

3.5.4. Настройка вида столбцов dataGridView2 (таблица Account)

В нашем случае нужно настроить следующие общие свойства dataGridView2:

  • свойство MultiSelect = False (запретить выделение нескольких строк);
  • ReadOnly = True. Запрещается редактировать ячейки dataGridView2 непосредственно. Изменение значений в ячейках будет происходить через специальные окна (формы);
  • AllowUserToDeleteRows = False. Запрещается удалять строки клавишей Del;
  • SelectionMode = FullRowSelect. Выделяется целая строка, а не отдельная ячейка строки.

 

3.5.4.1. Групповая настройка заголовков всех столбцов. Свойство ColumnHeadersDefaultCellStyle

С помощью свойства ColumnHeadersDefaultCellStyle настраивается общий вид столбцов по умолчанию. Более подробно это свойство описывается в п. 3.4.4.1.

Для ColumnHeadersDefaultCellStyle нужно настроить следующие внутренние свойства:

  • свойство Alignment = MiddleCenter;
  • свойство Bold = True.

 

3.5.4.2. Задание обобщенного отображения данных в столбцах dataGridView2 (свойство DefaultCellStyle)

В п. 3.4.4.2 подробно описываются особенности использования свойства DefaultCellStyle элемента управление dataGridView2.

Для таблицы Account нужно установить следующие свойства:

  • свойство Alignment = MiddleCenter.

 

3.5.4.3. Установка индивидуальных параметров отображения для каждого столбца таблицы

Настройка внешнего вида столбцов dataGridView2 осуществляется так же, как и dataGridView1. Для этого, в режиме проектирования, нужно вызвать команду «Edit Columns…» из контекстного меню dataGridView2 (см. п. 3.4.3.3.). Настраиваются свойства следующих полей:

  • в поле ID_Account свойство Visible = False (спрятать поле);
  • в поле ID_Worker свойство Visible = False;
  • в поле ANum свойство HeaderText = «Number»;
  • в поле ANum свойство DefaultCellStyle.Alignment = MiddleCenter;
  • в поле ANum свойство AutoSizeMode = AllCells;
  • в поле ADate свойство HeaderText = «Date»;
  • в поле ADate свойство DefaultCellStyle.Alignment = MiddleCenter;
  • в поле ADate свойство AutoSizeMode = AllCells;
  • в поле AInvNum свойство HeaderText = «Inv. Number»;
  • в поле AInvNum свойство DefaultCellStyle.Alignment = MiddleCenter;
  • в поле AInvNum свойство AutoSizeMode = AllCells;
  • в поле AObjName свойство HeaderText = «Object name»;
  • в поле AObjName свойство DefaultCellStyle.Alignment = MiddleLeft;
  • в поле AObjName свойство AutoSizeMode = AllCells;
  • в поле ACount свойство HeaderText = «Count»;
  • в поле ACount свойство DefaultCellStyle.Alignment = MiddleCenter;
  • в поле ACount свойство AutoSizeMode = AllCells;
  • в поле APrice свойство HeaderText = «Price»;
  • в поле APrice свойство DefaultCellStyle.Alignment = MiddleRight;
  • в поле APrice свойство AutoSizeMode = AllCells.

 

3.6. Создание вычисляемого поля «Sum» (Сумма) в таблице Account

Отдельным пунктом в данной теме выделено добавление вычисляемого поля.

Вычисляемое поле «Sum» в таблице Account можно добавлять различными способами. Например, можно создать это поле средствами Microsoft Access и создать просмотр (View). Здесь описывается один из возможных способов.

Результат поля Sum есть произведение полей ACount и APrice.

 

3.6.1. Добавление расчетного поля Sum в файл AccountDataSet.xsd

Файл AccountDataSet.xsd отображает таблицы (просмотры, сохраненные процедуры и прочее) базы данных Account, которые подключены к набору данных accountDataSet. Фактически, вычисляемое поле создается в этом файле.

Чтобы создать вычисляемое поле в таблице Account, нужно выполнить такую последовательность действий:

  • в режиме «Form1.cs [Design]» сделать клик правой кнопкой «мышки» на объекте accountTableAdapter. В результате откроется контекстное меню (рисунок 19);

C# Windows Forms Элемент управления dataGridView адаптер данных accountTableAdapter

Рис. 19. Контекстное меню адаптера данных accountTableAdapter

  • в контекстном меню выбрать команду «Edit Queries in DataSet Designer…». Откроется окно, отображающее содержимое файла «AccountDataSet1.xsd» (рисунок 20);

C# Windows Forms таблица Account файл AccountDataSet1.xsd

Рис. 20. Отображение таблицы Account в файле AccountDataSet1.xsd

  • вызвать контекстное меню для таблицы Account (рисунок 21). В меню выбрать команду Add->Column. В результате будет создано новое поле с именем DataColumn1.

C# Windows Forms команда новый столбец

Рис. 21. Вызов команды добавления нового столбца

  • Выделить поле DataColumn1 и в окне Properties установить свойство Name = «Sum» (рисунок 22). Изменения зафиксируются в таблице Account;

C# Базы данных Microsoft Access расчетное поле

Рис. 22. Установка свойства Name для расчетного поля

  • Установить свойство Expression в значение «ACount*APrice» (рисунок 23). Сохранить и закрыть файл AccountDataSet1.xsd;

C# Базы данных Microsoft Access Свойство Expression

Рис. 23. Свойство Expression дополнительного поля Sum

  • установить свойство DataType = System.Double (рисунок 24). Это необходимо для удобного отображения результатов произведения, которые заканчиваются нулевым значением. То есть, число 2.3 будет отображаться как 2.30.

C# Windows Forms База данных Свойство DataType

Рис. 24. Свойство DataType

После этого можно сохранить проект и закрыть файл AccountDataSet.xsd.

 

3.6.2. Подключение созданного поля Sum в dataGridView2

Следующим шагом нужно подключить созданное расчетное поле Sum в перечень полей dataGridView2 для его отображения.

Чтобы отобразить поле Sum в dataGridView1 нужно выполнить такие шаги:

  • Перейти в режим проектирования формы «Form1.cs [Design]». Сделать клик правой кнопкой мышки на элементе управления dataGridView2. В контекстном меню выбрать команду «Edit Columns…» (рисунок 25). В результате откроется окно «Edit Columns»;

C# Windows Forms Контекстное меню dataGridView команда "Edit Columns..."

Рис. 25. Контекстное меню dataGridView2. Вызов команды «Edit Columns…»

  • в окне Edit Columns выбрать команду «Add…» (рисунок 26). Откроется окно «Add Column».

C# Windows Forms Окно "Edit Columns" Команда "Add..."

Рис. 26. Окно «Edit Columns». Команда «Add…»

  • в окне «Add Column» в списке «Databound column» выбрать поле «Sum» (рисунок 27). Также можно изменить поле «Header text:». После выбора кнопки Add состоится переход в предшествующее окно Edit Columns;

C# Базы данных Элемент управления dataGridView Окно "Add Column"

Рис. 27. Окно «Add Column». Выбор поля Sum для отображения в dataGridView2

  • в окне «Edit Columns» поле Sum может находиться не на своей позиции. Поэтому, его позицию в таблице надо поправить с помощью кнопок стрелок вверх и вниз (рисунок 28).

C# dataGridView вычисляемое поле Sum

Рис. 28. Окончательное формирование вычисляемого поля Sum в окне «Edit Columns»

Формирование вычисляемого поля средствами MS Visual Studio завершено.

 

3.6.3. Настройка отображения вычисляемого поля «Sum» с точностью 2 знака после запятой

На данный момент вычисляемое поле Sum отображается в произвольном формате. Удобно иметь отображение этого поля с точностью 2 знака после запятой. Чтобы сделать это, нужно выполнить следующие действия:

  • вызвать контекстное меню элемента управления DataGridView2. В меню выбрать команду «Edit Columns…». В результате откроется окно «Edit Columns»;
  • в окне «Edit Columns» активировать (выделить) поле «Sum» (рисунок 29). В перечне свойств выбрать «…» напротив свойства DefaultCellStyle. Откроется окно «CellStyle Builder»;

C# Элемент управления dataGridView свойства ячейки

Рис. 29. Вызов окна редактирования свойств ячейки в поле «Sum»

  • в окне «CellStyle Builder» выбрать свойство Format (рисунок 30). Откроется окно «Format String Dialog»;

C# элемент управления dataGridView Окно CellStyleBuilder Свойство Format

Рис. 30. Окно CellStyleBuilder. Свойство Format

  • в окне «Format String Dialog» предлагается несколько известных форматов для отображения денежных величин. В поле «Format type:» нужно выбрать тип формата Numeric. Значение «Decimal places» = 2 (рисунок 31).

C#. Элемент управления dataGridView. Окно "Format String Dialog"

Рис. 31. Окно «Format String Dialog»

После выбора на OK состоится переход к предыдущему окну CellStyleBuilder. В этом окне можно поправить свойство Alignment в занчение MiddleRight.

Последним шагом нужно подтвердить на OK во всех последующих окнах. После этого, вычисляемое поле «Sum» будет отображаться с точностью 2 знака после запятой.

 

3.7. Настройка свойств элементов управления Label, Button, TextBox

Настроить следующие свойства элементов управления, которые размещаются в главной форме:

  • в label1 свойство Text = «Worker» (в дальнейшем label1.Text);
  • label2.Text = «Filter:»;
  • label3.Text = «Account»;
  • button1.Text = «Add…»;
  • button2.Text = «Delete»;
  • button3.Text = «Edit…»;
  • button4.Text = «Add record…»;
  • button5.Text = «Delete record»;
  • button6.Text = «Edit record…»;
  • textBox1.Text = «».

 

3.8. Общий вид формы «Form1.cs» после выполнения настроек

После настройки, вид главной формы приложения имеет вид, как показано на рисунке 32.

C# Windows Forms форма приложения

Рис. 33. Вид формы приложения после настройки

 

4. Проектирование дополнительных форм

4.1. Проектирование формы «FormAddWorker.cs» добавления нового работника

На этом шаге проектируется форма добавления информации о новом работнике.

Чтобы добавить новую форму, нужно использовать команду

Project -> Add Windows Form...

Откроется окно, в котором нужно указать имя файла формы (рисунок 33). В нашем случае задается имя «FormAddWorker.cs».

Более подробное описание того, как создается форма, описывается в теме:

C# Windows Forms новая форма FormAddWorker.cs

Рис. 33. Добавление новой формы FormAddWorker.cs к приложению

Нужно разместить следующие элементы управления (рисунок 34):

  • три элемента управления типа Label. Создаются объекты с именами label1, label2, label3;
  • два элемента управления типа Button. Создаются объекты с именами button1, button2;
  • один элемент управления типа ComboBox. Создается объект с именем comboBox1;
  • два элемента управления типа TextBox. Создаются объекты с именами textBox1, textBox2.

C# Windows Forms Форма "FormAddWorker.cs"

Рис. 34. Форма «FormAddWorker.cs»

Настраиваются следующие свойства элементов управления:

  • в форме свойство Text = «Add worker»(далее FormAddWorker.Text);
  • FormAddWorker.ControlBox = False;
  • FormAddWorker.StartPosition = CenterScreen;
  • FormAddWorker.FormBorderStyle = FixedDialog;
  • в элементе управления label1 свойство Text = «Name of worker» (label1.Text);
  • label2.Text = «Position»;
  • label3.Text = «M/F»;
  • button1.Text = «Add»;
  • button2.Text = «Cancel»;
  • button1.DialogResult = OK;
  • button2.DialogResult = Cancel;
  • textBox1.Modifiers = Public. Элемент управления textBox1 становится доступным из других форм и методов;
  • textBox2.Modifiers = Public;
  • comboBox1.Modifiers = Public.

В элементе управления comboBox1 нужно в свойство Items вписать строки, как показано на рисунке 35.

C# Windows Forms Свойство Items элемента управления comboBox1

Рис. 35. Свойство Items элемента управления comboBox1

После проектирования окно формы FormAddWorker показано на рисунке 36.

C# Windows Forms Форма FormAddWorker

Рис. 36. Форма FormAddWorker

 

4.2. Проектирование формы «FormDelWorker.cs» удаления работника

По образцу проектирования предыдущей формы (пункт 4.1) проектируется форма удаления работника которая размещается в файле FormDelWorker.cs.

На форме размещаются следующие элементы управления:

  • два элемента управления типа Label. Создается два объекта с именами label1, label2;
  • два элемента управления типа Button. Создается два объекта с именами button1, button2

Настроить следующие свойства элементов управления:

  • FormDelWorker.Text = «Delete worker»;
  • FormDelWorker.FormBorderStyle = FixedDialog;
  • FormDelWorker.StartPosition = CenterScreen;
  • FormDelWorker.ControlBox = False;
  • label1.Text = «Delete worker. Are you sure?»;
  • label2.Modifiers = Public. Этот элемент управления будет видим из главной формы и будет формироваться из нее;
  • button1.Text = «OK»;
  • button1.DialogResult = OK;
  • button2.Text = «Cancel»;
  • button2.DialogResult = Cancel.

После создания и настройки элементов управления форма имеет вид, как показано на рисунке 37.

C# Windows Forms Форма FormDelWorker.cs

Рис. 37. Форма FormDelWorker.cs

 

4.3. Проектирование формы «FormEditWorker.cs» редактирования информации о работнике

Форма FormEditWorker.cs предназначена для редактирования информации о работнике и будет вызваться командой

Worker->Edit...

Форма FormEditWorker.cs создается так же как и предыдущие формы. На форме размещаются следующие элементы управления:

  • три элемента управления типа Label. Создаются объекты с именами label1, label2, label3;
  • два элемента управления типа Button. Создаются объекты с именами button1, button2;
  • один элемент управления типа ComboBox. Создается объект с именем comboBox1;
  • два элемента управления типа TextBox. Создаются объекты с именами textBox1, textBox2.

Настраиваются следующие свойства элементов управления:

  • FormEditWorker.Text = «Edit worker»;
  • FormEditWorker.FormBorderStyle = FixedDialog;
  • FormEditWorker.StartPosition = CenterScreen;
  • FormEditWorker.ControlBox = False;
  • label1.Text = «Name of worker»;
  • label2.Text = «Position»;
  • label3.Text = «M/F»;
  • textBox1.Modifiers = Public;
  • textBox2.Modifiers = Public;
  • comboBox1.Modifiers = Public;
  • comboBox1.Items = { «M», «F» };
  • button1.Text = «Edit»;
  • button2.Text = «Cancel»;
  • button1.DialogResult = OK;
  • button2.DialogResult = Cancel.

После проектирования, окно формы имеет вид как показано на рисунке 38.

C# Windows Forms Окно редактирования информации о работнике

Рис. 38. Окно редактирования информации о работнике

 

4.4. Проектирование формы «FormAddAccount.cs» добавления материального средства

Форма FormAddAccount.cs предназначена для добавления строки материального средства. На форме размещаются следующие элементы управления:

  • 6 элементов управления типа Label. Создаются объекты label1, label2, label3, label4, label5, label6;
  • 6 элементов управления типа TextBox. Создаются объекты textBox1, textBox2, textBox3, textBox4, textBox5, textBox6;
  • 2 элемента управления типа Button. Создаются объекты button1, button2.

Настраиваются свойства следующих элементов управления:

  • FormAddAccount.Text = «Add Inventory»;
  • FormAddAccount.FormBorderStyle = FixedDialog;
  • FormAddAccount.ControlBox = False;
  • FormAddAccount.StartPosition = CenterScreen;
  • label1.Text = «Number»;
  • label2.Text = «Date»;
  • label3.Text = «Inventory number»;
  • label4.Text = «Object name»;
  • label5.Text = «Count»;
  • label6.Text = «Price»;
  • button1.Text = «Add»;
  • button1.DialogResult = OK;
  • button2.Text = «Cancel»;
  • button2.DialogResult = Cancel;
  • textBox1.Modifiers = Public;
  • textBox2.Modifiers = Public;
  • textBox3.Modifiers = Public;
  • textBox4.Modifiers = Public;
  • textBox5.Modifiers = Public;
  • textBox6.Modifiers = Public.

На рисунке 39 изображено окно формы FormAddAccount.cs после настройки.

C# Windows Forms Окно FormAddAccount.cs после настройки

Рис. 39. Окно FormAddAccount.cs после настройки

 

4.5. Проектирование формы «FormDelAccount.cs» удаления строки материального средства

Форма FormDelAccount.cs есть окно запроса-подтверждения удаления строки материального средства.

На форме размещаются следующие элементы управления:

  • два элемента управления типа Button (button1, button2);
  • два элемента управления типа Label (label1, label2).

Нужно настроить следующие свойства элементов управления:

  • FormDelAccount.Text = «Delete Inventory»;
  • FormDelAccount.FormBorderStyle = FixedDialog;
  • FormDelAccount.ControlBox = False;
  • FormDelAccount.StartPosition = CenterScreen;
  • label1.Text = «Are you sure you want to delete?»;
  • label2.Modifiers = Public. Эта строка будет изменяться в главной форме, поэтому может быть видимой извне;
  • button1.Text = «Delete»;
  • button1.DialogResult = OK;
  • button2.Text = «Cancel»;
  • button2.DialogResult = Cancel.

На рисунке 40 отображен общий вид формы

C# Windows Forms. Общий вид формы FormDelAccount

Рис. 40. Общий вид формы FormDelAccount

 

4.6. Проектирование формы «FormEditAccount.cs» редактирования строки

Форма FormEditAccount.cs предназначена для редактирования информации текущей строки таблицы Account. На форме размещаются следующие элементы управления:

  • 6 элементов управления типа Label: label1, label2, label3, label4, label5, label6;
  • 6 элементов управления типа TextBox: textBox1, textBox2, textBox3, textBox4, textBox5, textBox6;
  • 2 элемента управления типа Button: button1, button2.

Настраиваются следующие свойства формы и элементов управления:

  • FormEditAccount.Text = «Edit Inventory»;
  • FormEditAccount.FormBorderStyle = FixedDialog;
  • FormEditAccount.ControlBox = False;
  • FormEditAccount.StartPosition = CenterScreen;
  • label1.Text = «Number»;
  • label2.Text = «Date»;
  • label3.Text = «Inventory number»;
  • label4.Text = «Object name»;
  • label5.Text = «Count»;
  • label6.Text = «Price»;
  • button1.Text = «Add»;
  • button1.DialogResult = OK;
  • button2.Text = «Cancel»;
  • button2.DialogResult = Cancel;
  • textBox1.Modifiers = Public;
  • textBox2.Modifiers = Public;
  • textBox3.Modifiers = Public;
  • textBox4.Modifiers = Public;
  • textBox5.Modifiers = Public;
  • textBox6.Modifiers = Public.

После настройки вид формы FormEditAccount.cs изображен на рисунке 41.

C# Windows Forms Форма FormEditAccount.cs

Рис. 41. Форма FormEditAccount.cs

 

5. Реализация программного кода

Остается только написать программный код обработчиков событий.

5.1. Программирование обработчиков событий главной формы Form1
5.1.1. Программирование событий Click и CellEnter элемента управления dataGridView1. Свойство Filter. Учет связи между таблицами при их отображении

На данный момент отображаются все данные таблиц Worker и Account. Однако, в нашем случае, нужно откорректировать отображение данных в таблицах по следующему требованию.

Если в таблице Worker выбрать работника, то таблица Account должна отображать данные, которые касаются только этого работника. Как известно, таблицы Worker и Account связаны между собой по полю ID_Worker. Это означает, что таблица Account должна отображать данные, которые соответствуют значению ID_Worker активной (выделенной) строки таблицы Worker.

В нашем случае нужно запрограммировать два события для элемента управления dataGridView1:

  • событие Click (рисунок 43). Это событие генерируется в случае, когда пользователь сделал клик на некоторой строке;
  • событие CellEnter (рисунок 44). Это событие генерируется, когда строка таблицы получает фокус ввода.

C# Windows Forms. Событие Click элемента управления dataGridView1

Рис. 43. Событие Click элемента управления dataGridView1

C# Windows Forms. Событие CellEnter элемента управления dataGridView1

Рис. 44. Событие CellEnter элемента управления dataGridView1

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

Текст обработчиков событий следующий:

private void dataGridView1_Click(object sender, EventArgs e)
{
    // создать фильтр, который выведет в dataGridView2 то что нужно
    int id;
    int index;

    index = dataGridView1.CurrentRow.Index;

    // взять значения id = Worker.ID_Worker
    id = (int)dataGridView1.Rows[index].Cells[0].Value;
    accountBindingSource.Filter = "ID_Worker = " + id.ToString();
}

private void dataGridView1_CellEnter(object sender, DataGridViewCellEventArgs e)
{
    // создать фильтр, который выведет в dataGridView2 то что нужно
    int id;
    int index;

    index = dataGridView1.CurrentRow.Index;

    // взять значения id = Worker.ID_Worker
    id = (int)dataGridView1.Rows[index].Cells[0].Value;
    accountBindingSource.Filter = "ID_Worker = " + id.ToString();
}

Как видно из вышеприведенного кода, текст обработчиков событий одинаков. Важным здесь есть поле Filter объекта accountBindingSource, который был создан системой при подключении к таблице Account. Это поле, есть, фактически, фрагментом условия в запросе на языке SQL. На языке SQL условие определяется ключевым словом WHERE.

Например, если в Filter указать

ID_Worker = 5

это эта строка будет преобразована в фрагмент SQL-кода

WHERE ID_Worker = 5

 

5.1.2. Тестовый запуск. Текст программы

Теперь можно запустить приложение и проверить его работу. При изменении строки в таблице Worker автоматически выводятся связанные с этой строкой данные таблицы Account. Как известно, данные связаны полем ID_Worker.

На данный момент, текст модуля 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;

namespace Oblik01
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // TODO: This line of code loads data into the 'accountDataSet.Account' table. You can move, or remove it, as needed.
            this.accountTableAdapter.Fill(this.accountDataSet.Account);
            // TODO: This line of code loads data into the 'accountDataSet.Worker' table. You can move, or remove it, as needed.
            
this.workerTableAdapter.Fill(this.accountDataSet.Worker);
        }

        private void dataGridView1_Click(object sender, EventArgs e)
        {
            // создать фильтр, который выведет в dataGridView2 то что нужно
            int id;
            int index;

            index = dataGridView1.CurrentRow.Index;
            // взять значения id = Worker.ID_Worker
            id = (int)dataGridView1.Rows[index].Cells[0].Value; // работает
            accountBindingSource.Filter = "ID_Worker = " + id.ToString();
        }

        private void dataGridView1_CellEnter(object sender, DataGridViewCellEventArgs e)
        {
            // создать фильтр, который выведет в dataGridView2 то что нужно
            int id;
            int index;

            index = dataGridView1.CurrentRow.Index;

            // взять значения id = Worker.ID_Worker
            id = (int)dataGridView1.Rows[index].Cells[0].Value; // работает
            accountBindingSource.Filter = "ID_Worker = " + id.ToString();
        }
    }
}

 

5.1.3. Программирование команды «Worker» => «Add…»

Если пользователь выбрал команду «Add…» из меню Worker, то должно вызваться окно FormAddWorker.cs. В этом окне вводятся данные нового работника.

Текст обработчика события Click выбора команды меню «Worker» => «Add…» имеет следующий вид:

C#. Windows Forms. Событие Click команды меню "Worker" => "Add..."

Рис. 45. Событие Click команды меню «Worker» => «Add…»

Текст обработчика события следующий:

private void addToolStripMenuItem_Click(object sender, EventArgs e)
{
    FormAddWorker f = new FormAddWorker(); // создать форму

    if (f.ShowDialog() == DialogResult.OK) // отобразить форму
    {
        // если OK, то добавить работника
        string WName, WPosition, WSex;

        WName = f.textBox1.Text;
        WPosition = f.textBox2.Text;
        WSex = f.comboBox1.Items[f.comboBox1.SelectedIndex].ToString();

        // работает
        this.workerTableAdapter.Insert(WName, WPosition, WSex); // вставка
        this.workerTableAdapter.Fill(this.accountDataSet.Worker); // отображение
    }
}

В вышеприведенном коде вызывается окно FormAddWorker, которое было спроектировано в п. 4.1. Затем из этого окна заполняются внутренние переменные WName, WPosition, WSex.

В будущему, вся работа с изменением данных в таблице Worker будет осуществляться с объектом workerTableAdapter, который был создан системой при подключении к базе данных.

Вставка строки осуществляется методом Insert() объекта workerTableAdapter. Этот метод формируется системой программно при подключении таблицы Worker. В методе программно формируются параметры, которые соответствуют полям таблицы Worker. Это есть очень удобно.

Метод Fill() фиксирует изменения в базе данных.

 

5.1.4. Программирование команды «Worker» => «Delete»

При вызове команды Delete из меню Worker вызывается форма подтверждения FormDelWorker. Текст обработчика события команды Delete следующий

private void deleteToolStripMenuItem_Click(object sender, EventArgs e)
{
    // Worker => Delete
    FormDelWorker f = new FormDelWorker(); // создать форму
    int id_worker;
    string WName, WPosition, WSex;
    int index;

    // взять номер текущей (выделенной) строки в dataGridView1
    index = dataGridView1.CurrentRow.Index;

    // заполнить внутренние переменные из текущей строки dataGridView1
    id_worker = Convert.ToInt32(dataGridView1[0, index].Value);
    WName = Convert.ToString(dataGridView1[1, index].Value);
    WPosition = Convert.ToString(dataGridView1[2, index].Value);
    WSex = Convert.ToString(dataGridView1[3, index].Value);

    // сформировать информационную строку
    f.label2.Text = WName + " " + WPosition;

    if (f.ShowDialog() == DialogResult.OK)
    {
        workerTableAdapter.Delete(id_worker, WName, WPosition, WSex); // метод Delete
        this.workerTableAdapter.Fill(this.accountDataSet.Worker);
    }
}

В этом обработчике важным есть метод Delete() объекта workerTableAdapter. В этом методе нужно указать значения полей строки, которая удаляется.

 

5.1.5. Программирование команды «Worker» => «Edit…»

Редактирование работника осуществляется в форме FormEditWorker.cs (см. п. 4.3) командой «Edit…» меню Worker. Текст обработчика события выбора команды

private void editToolStripMenuItem_Click(object sender, EventArgs e)
{
    // Worker => Edit...
    FormEditWorker f = new FormEditWorker(); // создать форму

    int index;
    string WName, WPosition, WSex;
    int id_worker;

    if (dataGridView1.RowCount <= 1) return;

    // получить позицию выделенной строки в dataGridView1
    index = dataGridView1.CurrentRow.Index;

    if (index == dataGridView1.RowCount - 1) return; //

    // получить данные строки
    id_worker = (int)dataGridView1.Rows[index].Cells[0].Value;
    WName = (string)dataGridView1.Rows[index].Cells[1].Value;
    WPosition = (string)dataGridView1.Rows[index].Cells[2].Value;
    WSex = (string)dataGridView1.Rows[index].Cells[3].Value;

    // заполнить поля формы f
    f.textBox1.Text = WName;
    f.textBox2.Text = WPosition;

    if (WSex == "M") f.comboBox1.SelectedIndex = 0;
    else f.comboBox1.SelectedIndex = 1;

    if (f.ShowDialog() == DialogResult.OK) // вызвать форму FormEditWorker
    {
        string nWName, nWPosition, nWSex;

        // получить новые (измененные) значения из формы
        nWName = f.textBox1.Text;
        nWPosition = f.textBox2.Text;
        nWSex = f.comboBox1.Items[f.comboBox1.SelectedIndex].ToString();

        // сделать изменения в адаптере
        this.workerTableAdapter.Update(nWName, nWPosition, nWSex, id_worker, WName, WPosition, WSex);
        this.workerTableAdapter.Fill(this.accountDataSet.Worker);
    }
}

Фактические изменения в таблице осуществляет метод Update() адаптера данных workerTableAdapter. Этот метод получает старые и новые значения строки таблицы Worker.

 

5.1.6. Программирование команды «Inventory» => «Add…»

По образцу команды Worker => «Add…» реализуется программный код команды «Inventory» => «Add…». Текст обработчика события следующий:

private void addToolStripMenuItem1_Click(object sender, EventArgs e)
{
    // Inventory => Add...
    FormAddAccount f = new FormAddAccount(); // окно

    if (f.ShowDialog() == DialogResult.OK)
    {
        int Id_Worker;
        int index;
        string ANum, ADate, AInvNum, AObjName;
        short ACount;
        double APrice;

        // взять значения ID_Worker из таблицы Worker
        index = dataGridView1.CurrentRow.Index; // позиция в dataGridView1
        Id_Worker = (int)dataGridView1.Rows[index].Cells[0].Value;

        // взять значения других полей из формы FormAddAccount
        ANum = f.textBox1.Text;
        ADate = f.textBox2.Text;
        AInvNum = f.textBox3.Text;
        AObjName = f.textBox4.Text;
        ACount = Convert.ToInt16(f.textBox5.Text);
        APrice = Convert.ToDouble(f.textBox6.Text);

        this.accountTableAdapter.Insert(Id_Worker, ANum, ADate, AInvNum, AObjName, ACount, APrice);
        this.accountTableAdapter.Fill(this.accountDataSet.Account);
    }
}

Метод Insert() объекта accountTableAdapter получает входными параметрами значения полей таблицы Account.

 

5.1.7. Программирование команды «Inventory» => «Delete»

Текст обработчика события выбора команды Delete из меню Inventory:

private void deleteToolStripMenuItem1_Click(object sender, EventArgs e)
{
    // Inventory => Delete
    FormDelAccount f = new FormDelAccount();
    int id_account, id_worker;
    string ANum, ADate, AInvNum, AObjName;
    short ACount;
    double APrice;
    int index;

    // взять индекс выделенной (текущей) строки в dataGridView2
    index = dataGridView2.CurrentRow.Index;

    // взять значения полей строки с номером index
    id_account = Convert.ToInt32(dataGridView2[0, index].Value);
    id_worker = Convert.ToInt32(dataGridView2[1, index].Value);
    ANum = Convert.ToString(dataGridView2[2, index].Value);
    ADate = Convert.ToString(dataGridView2[3, index].Value);
    AInvNum = Convert.ToString(dataGridView2[4, index].Value);
    AObjName = Convert.ToString(dataGridView2[5, index].Value);
    ACount = Convert.ToInt16(dataGridView2[6, index].Value);
    APrice = Convert.ToDouble(dataGridView2[7, index].Value);

    // сформировать информационную строку в окне FormDelAccount
    f.label2.Text = ANum + " / " + ADate + " / " + AInvNum + " / " +
        AObjName + " / " + ACount + " / " + APrice;

    if (f.ShowDialog() == DialogResult.OK) // вывести окно
    {
        this.accountTableAdapter.Delete(id_account, id_worker,
            ANum, ADate, AInvNum, AObjName, ACount, APrice); // удалить строку
        this.accountTableAdapter.Fill(this.accountDataSet.Account); // зафиксировать изменения
    }
}

 

5.1.8. Программирование команды «Inventory» => «Edit…»

Текст обработчика события следующий

private void editToolStripMenuItem1_Click(object sender, EventArgs e)
{
    // Inventory => Edit...
    FormEditAccount f = new FormEditAccount();

    int index;
    int id_account;
    int id_worker;
    string ANum, ADate, AInvNum, AObjName;
    short ACount;
    double APrice;

    if (dataGridView2.RowCount <= 1) return;

    // взять номер текущей строки в dataGridView2
    index = dataGridView2.CurrentRow.Index;

    if (index == dataGridView2.RowCount-1) return; //

    // получить данные строки
    id_account = (int)dataGridView2.Rows[index].Cells[0].Value;
    id_worker = (int)dataGridView2.Rows[index].Cells[1].Value;
    ANum = (string)dataGridView2.Rows[index].Cells[2].Value;
    ADate = (string)dataGridView2.Rows[index].Cells[3].Value;
    AInvNum = (string)dataGridView2.Rows[index].Cells[4].Value;
    AObjName = (string)dataGridView2.Rows[index].Cells[5].Value;
    ACount = (short)dataGridView2.Rows[index].Cells[6].Value;
    APrice = (double)dataGridView2.Rows[index].Cells[7].Value;

    // заполнить данными строку в FormEditAccount
    f.textBox1.Text = ANum;
    f.textBox2.Text = ADate;
    f.textBox3.Text = AInvNum;
    f.textBox4.Text = AObjName;
    f.textBox5.Text = Convert.ToString(ACount);
    f.textBox6.Text = Convert.ToString(APrice);

    // заполнить поля формы FormEditAccount
    if (f.ShowDialog() == DialogResult.OK) // вызвать форму
    {
        // новые значения строки
        string nANum, nADate, nAInvNum, nAObjName;
        short nACount;
        double nAPrice;

        // взять новые значения
        nANum = f.textBox1.Text;
        nADate = f.textBox2.Text;
        nAInvNum = f.textBox3.Text;
        nAObjName = f.textBox4.Text;
        nACount = Convert.ToInt16(f.textBox5.Text);
        nAPrice = Convert.ToDouble(f.textBox6.Text);

        // обновить данные в строке
        this.accountTableAdapter.Update(id_worker,nANum,nADate, nAInvNum, nAObjName,nACount,nAPrice,
        id_account,id_worker, ANum,ADate,AInvNum,AObjName,ACount,APrice);
        this.accountTableAdapter.Fill(this.accountDataSet.Account);
    }
}

 

5.1.9. Программирование фильтра по имени в таблице «Worker». Событие TextChanged элемента управления textBox1

С целью обеспечения удобства, в программе можно использовать фильтр по полю WName таблицы Worker. Для этого в программе используется элемент управления textBox1 (рисунок 46). Для обеспечения быстрой обработки текста с textBox1, введенный текст обрабатывается в событии TextChanged (рисунок 46).

C#. Windows Forms. Элемент управления textBox1. Событие TextChanged

Рис. 46. Элемент управления textBox1. Событие TextChanged

Событию TextChanged соответствует обработчик события textBox1_TextChanged(). Чтобы профильтровать записи в поле WName таблицы Worker, нужно в объекте workerBindingSource заполнить значение свойства Filter. Это свойство соответствует части «…WHERE …» SQL-команды «SELECT … FROM … WHERE …». В нашем случае, нужно сформировать строку

WName LIKE 'Text%'

где Text – текст, который введен в строке textBox1.Text.

Текст обработчика события следующий

// фильтр в textBox1
private void textBox1_TextChanged(object sender, EventArgs e)
{
    workerBindingSource.Filter = "WName LIKE '" + textBox1.Text + "%'";
}

После этого, в таблице Worker будут выводиться только те записи, которые начинаются с символов, которые набраны в textBox1.Text. Если в textBox1.Text не введено ничего, то будут выводиться все записи (строки) таблицы Worker.

 

5.1.10. Программирование команды «Выход»

Текст обработчика события Click команды «Выход»

// Выход
private void exitToolStripMenuItem_Click(object sender, EventArgs e)
{
    Close();
}

 

5.2. Программирование события Load формы FormAddWorker

В событии Load формы FormAddWorker нужно сделать начальную инициализацию значений полей формы.

Текст обработчика события Load формы FormAddWorker (Worker -> Add…):

private void FormAddWorker_Load(object sender, EventArgs e)
{
    textBox1.Text = "";
    textBox2.Text = "";
    comboBox1.SelectedIndex = 1;
    textBox1.Focus(); // при открытии окна, textBox1 получает фокус
}

 

5.3. Программирование события Load формы FormEditWorker

Текст обработчика события FormEditWorker

private void FormEditWorker_Load(object sender, EventArgs e)
{
    textBox1.Focus();
}

 

5.4. Программирование события Load формы FormAddAccount

Текст обработчика события следующий:

private void FormAddAccount_Load(object sender, EventArgs e)
{
    textBox1.Text = "";
    textBox2.Text = "";
    textBox3.Text = "";
    textBox4.Text = "";
    textBox5.Text = "";
    textBox6.Text = "";
    textBox1.Focus();
}

 

5.5. Программирование события Load формы FormEditAccount

Текст обработчика события следующий

private void FormEditAccount_Load(object sender, EventArgs e)
{
    textBox1.Focus();
}

 

6. Перенаправление обработчиков событий клика на кнопках быстрого вызова на команды меню

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

  • кнопка «Add…» вызывает команду меню «Worker->Add…»;
  • кнопка «Delete» вызывает команду «Worker -> Delete»;
  • кнопка «Edit…» вызывает команду «Worker -> Edit»;
  • кнопка «Add record…» вызывает команду «Inventory -> Add…»;
  • кнопка «Delete record» вызывает команду «Inventory-> Delete»;
  • кнопка «Edit record…» вызывает команду «Inventory -> Edit».

C# Windows Forms Команда меню "Worker -> Add..." и кнопка "Add"

Рис. 47. Команда меню «Worker -> Add…» и кнопка «Add»

Не нужно снова программировать обработчики события Click для кнопок. Средствами MS Visual Studio настраиваются соответствующие обработчики событий, как показано на рисунке 48. Для события Click кнопки Add… (button1) назначается обработчик события addToolStripMenuItem_Click()

C# Windows Forms addToolStripMenuItem_Click()

Рис. 48. Назначение метода обработки события addToolStripMenuItem_Click() для кнопки «Add…»

Также назначаются другим кнопкам формы соответствующие обработчики событий:

  • команде Delete назначается метод deleteToolStripMenuItem_Click();
  • команде Edit… назначается метод editToolStripMenuItem_Click();
  • команде Add record… назначается метод addToolStripMenuItem1_Click();
  • команде Delete record назначается метод deleteToolStripMenuItem1_Click();
  • команде Edit record… назначается метод editToolStripMenuItem1_Click().

 

7. Запуск программы на выполнение. Выводы

Теперь можно запустить программу на выполнение.

В данной теме продемонстрировано использование средств MS Visual Studio для управления базой данных Microsoft Access.

Как было показано, не нужно программно формировать запросы на языке SQL. Для этого, в объектах, которые создает система, нужно правильно настроить соответствующие свойства. Таким образом, достигается минимум написания программного кода. Так как большинство работы выполняется в диалоговых окнах, где настраивается внешний вид, связи, отображение.

В работе подробно излагаются:

  • организация навигации по таблицам по принципу «главный» — «подчиненный». При изменении активной записи в главной таблице соответственно выводятся связанные с ней записи подчиненной таблицы;
  • использование объектов типа TabelAdapter, BindingSource для удобного оперирования данными в таблицах;
  • удобный вызов команд изменения данных в таблицах (INSERT, UPDATE, DELETE) путем вызова соответствующих методов, которые генерируются MS Visual Studio;
  • создание вычисляемого поля и задание точности вывода 2 знака после запятой;
  • программирование фильтра для вывода записей в таблице по заданному шаблону;
  • использование оконного интерфейса MS Visual Studio для удобной настройки вида (отображения) полей таблиц базы данных.

 


Связанные темы