Свойство
|
Описание
|
AcceptButton
|
Позволяет
задать кнопку или получить информацию о кнопке, которая будет активизирована
при нажатии пользователем клавиши Enter
|
ActiveMDIChild, IsMDIChild, IsMDIContainer
|
Свойства
предназначены для использования в приложениях с многодокументным интерфейсом
(MDI)
|
AutoScale
|
Позволяет
установить или получить значение, определяющее, будет ли форма автоматически
изменять свои размеры, чтобы соответствовать высоте шрифта, используемого на
форме, или размерам размещенных на ней компонентов
|
FormBorderStyle
|
Позволяет
установить или получить стиль рамки вокруг формы (используются значения
перечисления FormBorderStyle)
|
Cancel
Button
|
Позволяет
задать кнопку или получить информацию о кнопке, которая будет активизирована
при нажатии пользователем клавиши Esc
|
Control
Box
|
Позволяет
установить или получить значение, определяющее, будет ли присутствовать
стандартная кнопка системного меню в верхнем левом углу заголовка формы
|
Menu, MergedMenu
|
Используются
для установки или получения информации о меню на форме
|
2.
Проектирование архитектуры программы
В данной работе нужно выбрать архитектуру программы, поэтому
рассмотрим несколько примеров:
Одноуровневые приложения. Пример одноуровневого приложения -
Microsoft Excel, поддерживающий как юльзовательский интерфейс, так и прикладную
логику. К последней относятся раз-юобразные математические функции, проверка
правописания и др. На том же уров-ie содержатся и подпрограммы, обеспечивающие
сохранение и доступ к файлам дан-шх. Традиционные приложения для мэйнфреймов
тоже являются одноуровневыми монолитными), просто к ним обращается множество
клиентских программ.
Двухуровневые приложения. В двухуровневых, или стандартных
клиент-серверных, приложениях компоненты, отвечающие за презентационный сервис
и прикладную логику, размещаются на клиентской машине и обращаются к общему
источнику данных по сети. В таких приложениях пользовательский интерфейс и
прикладная логика образуют один уровень на клиентском компьютере, а сервисы
данных предоставляются отдельными приложениями (на серверах) вроде СУБД SQL
Server или Oracle. Этот сценарий часто встречается в клиент-серверных
приложениях. Например, приложение, написанное на Visual Basic, вызывает
хранимые процедуры SQL Server и таким образом получает нужные данные. Первое
приложение - это один уровень, второе - другой. Код для пользовательского
интерфейса и поддержки прикладной логики не обязательно должен находиться в
одном проекте; приложение, написанное на Visual Basic, может обращаться к
данным, вызывая нужные функции из динамически подключаемой библиотеки (DLL). В
этом случае, хотя пользовательский интерфейс и прикладная логика оказываются в
разных местах, они все равно считаются одним уровнем. Двухуровневые приложения
хорошо работают в масштабах подразделения при наличии умеренного количества
пользователей (до 100), единственной базы данных и быстродействующей защищенной
сети. В частности, двухуровневое приложение было бы удачным решением для
рабочей группы, принимающей заказы на какую-либо продукцию.
Многоуровневые приложения. В подобных приложениях
презентационный сервис (первый уровень), прикладная логика (второй уровень) и
сервис данных (третий уровень) отделены друг от друга. Однако уровней может
быть не три, а больше. Именно поэтому многоуровневые приложения иногда называют
и-уровневыми, где п больше или равно трем. Логические уровни не
обязательно должны соответствовать их физическому местонахождению в сети.
Например, все три уровня могут быть размещены на двух машинах или, напротив,
распределены по пяти компьютерам. Компоненты, отвечающие за презентационный
сервис, поддерживают пользовательский интерфейс и запрашивают прикладные
сервисы у компонентов промежуточного уровня, которые реализуют прикладную логику
и выдают запросы к базам данных. В многоуровневом приложении клиент
предоставляет только пользовательский интерфейс. Прикладная логика реализуется
промежуточным уровнем, который размещается между пользовательским интерфейсом и
системой хранения данных.
Итак, больше всего для написания нашей программы подходит
двухуровневая система, отвечающая всем необходимым требованиям.
Интерфейс нашей программы простой и интуитивно понятный, для
максимального удобства элементы кнопок расположены в левой части окна
программы.
Такие как:
сотрудники
техника
списанная
неиспользуемая
В рабочем пространстве находится само окно с данными из базы
данный (рис. 1), а в нижнем правом углу кнопки для изменения содержимого базы
данных.
Итак, мы находимся на главном окне работы с программой на
которой можем кликнув, кнопку из левой части увидеть информацию по
"сотрудникам" - это порядковый номер, Ф. И.О. занимаемую должность,
дату рождения и технику которая значится за ним.
интерфейс программа двухуровневый архитектура
Рисунок 1 - Основное окно
Если щелкнуть на строку, то откроется окно сотрудники (рис.
2) (для других позиций действия те же) в котором мы можем изменить информацию,
а так же сохранить эту информацию или отредактировать.
Рисунок 2 - Сотрудники
Открыв окно, щелкнув по строке техника, мы увидим
наименование этой техники её статус и дату создания или приобретения техники.
Рисунок 3 - Техника
Если мы откроем аналогичные окна, то мы увидим две кнопки,
одна для изменения, другая для сохранения информации в базе данных.
База данных создана на платформе SQLite, данные хранятся в
файле, сделано это для удобства, чтобы открывалась на любом компьютере, работает
через запросы SQL. В базе данных есть две таблицы сотрудники и техника (рис. 4).
Рисунок 4 - Таблицы баз данных
Создание таблицы сотрудники:
string createEmpl =
@"DROP TABLE IF EXISTS employee;TABLE employee (INTEGER PRIMARY KEY
AUTOINCREMENT,TEXT,TEXT,TEXT,TEXT,TEXT);INTO employee (FirstName, LastName,
Position, BirthDate, Technic)('Ivan', 'Nosov', 'Manager', '01.03.1985',
'PC-1002');INTO employee (FirstName, LastName, Position, BirthDate,
Technic)('Leonid', 'Satin', 'Worker', '04.10.1970', 'PC-2024');INTO employee
(FirstName, LastName, Position, BirthDate, Technic)('Elena', 'Vasilieva',
'Worker', '09.12.1990', 'PC-1206');INTO employee (FirstName, LastName,
Position, BirthDate, Technic)('Petr', 'Osinin', 'Worker', '26.02.1995',
'PC-3245');INTO employee (FirstName, LastName, Position, BirthDate,
Technic)('Nikolai', 'Losev', 'Manager', '16.03.1978', 'PC-1134');INTO employee
(FirstName, LastName, Position, BirthDate, Technic)('Evgenij', 'Filatov',
'Director', '02.09.1979', 'PC-1364');INTO employee (FirstName, LastName,
Position, BirthDate, Technic)('Tamara', 'Dolina', 'Worker', '09.11.1991',
'PC-7811');INTO employee (FirstName, LastName, Position, BirthDate,
Technic)('Anton', 'Stepanov', 'Worker', '22.01.1992', 'PC-9912');INTO employee
(FirstName, LastName, Position, BirthDate, Technic)('Vladimir', 'Kazakov',
'Manager', '01.01.1986', 'PC-4551');INTO employee (FirstName, LastName,
Position, BirthDate, Technic)('Svetlana', 'Andreeva', 'Worker', '14.11.1976',
'PC-4651');INTO employee (FirstName, LastName, Position, BirthDate,
Technic)('Stepan', 'Kozlov', 'Worker', '09.12.1990', 'PC-6453');INTO employee
(FirstName, LastName, Position, BirthDate, Technic)('Ekaterina', 'Loyko',
'Worker', '26.02.1995', 'PC-3451');INTO employee (FirstName, LastName,
Position, BirthDate, Technic)('Stanislav', 'Vlasov', 'Security', '31.04.1989',
'PC-1278'); ";
Открытие окна сотрудники и техники:
// открыть форму сотрудникаvoid
OpenEmployeeForm (bool created)
{employee =
null;(created)= new Employee ();= new Employee (gridView. SelectedRows
[0]);emplForm = new EmployeeForm ();. SetEmployee (employee, created);. Show
();
}
// открыть форму техникиvoid
OpenTechnicForm (bool created)
{technic =
null;(created)= new Technic ();= new Technic (gridView. SelectedRows
[0]);technicForm = new TechnicForm ();. SetTechnic (technic, created);
technicForm. Show ();
4.
Тестирование программы
Программа тестировалась на плотформах: Windows 7, Windows 8,
Windows server 2012 r2. Тестирование происходило вручную по всем моментам
требуемым курсовым заданием.
Заключение
При разработке курсового проекта был использован язык
программирования c #. Программа создавалась в программе Visual Studio 2013. Программа
соответствует набору требований.
Есть возможность добавлять и изменять базу данных, а также
программы на интуитивном уровне.
Программа создана для учета средств, индивидуального
пользования компьютерной техникой с привязкой на конкретного пользователя с
личными данными.
Программа будет полезна системным администраторам или
бухгалтерам.
Список
используемой литературы
1. Агуров
П. C#. Разработка компонентов в MS Visual Studio 2005/2008. - СПб.:
БХВ-петербург, 2008. - 480с
2. Википедия - свободная
энциклопедия [Электронный ресурс] / Wikimedia Foundation, Inc. - 2012. - Режим доступа: http://ru.
wikipedia.org/wiki/C_Sharp <http://ru.wikipedia.org/wiki/C_Sharp> - Дата
доступа: 15.05.2013.
. Абрамян М. Visual C#
на примерах. - СПб.: БХВ-петербург, 2008. - 496с
. http://www.mini-soft.ru/book/c_sharp/index.
php <http://www.mini-soft.ru/book/c_sharp/index.php>
Приложение А
TurtsevCourseWork. cs
{partial class MainForm: Form
{MainForm ()
{();
}GridEnum _currentList =
GridEnum. Employee;
// открыть список сотрудниковvoid btnEmployeeList_Click (object sender, EventArgs e)
{. ExecuteAndShowDataGrid
(gridView, "SELECT * FROM employee");
_currentList = GridEnum.
Employee;
}
// открыть список техникиvoid btnTechnicList_Click (object sender, EventArgs e)
{. ExecuteAndShowDataGrid
(gridView, "SELECT * FROM Technics");
_currentList = GridEnum. Technics;
}
// открыть список списанной техники
private void
btnShowInventory_Click (object sender, EventArgs e)
{. ExecuteAndShowDataGrid
(gridView, "SELECT * FROM Technics WHERE Inventarized = 'Yes'");
_currentList = GridEnum.
Inventarized;
}
// событие загрузки формыvoid MainForm_Load (object sender, EventArgs e)
{. ExecuteAndShowDataGrid
(gridView, "SELECT * FROM employee");
}
// кнопка удалитьvoid btnDeleteRecord_Click (object sender, EventArgs e)
{(_currentList)
{(GridEnum. Employee):. ExecuteCommand
(String. Format ("DELETE FROM employee WHERE id={0};", gridView.
SelectedRows [0]. Cells ["id"]. Value));. ExecuteAndShowDataGrid
(gridView, "SELECT * FROM employee");;(GridEnum. Technics):.
ExecuteCommand (String. Format ("DELETE FROM Technics WHERE id={0};",
gridView. SelectedRows [0]. Cells ["id"]. Value));.
ExecuteAndShowDataGrid (gridView, "SELECT * FROM
Technics");;(GridEnum. NonUsed):. ExecuteCommand (String. Format
("DELETE FROM Technics WHERE id={0};", gridView. SelectedRows [0].
Cells ["id"]. Value));. ExecuteAndShowDataGrid (gridView,
"SELECT * FROM Technics WHERE Inventarized = 'No' AND Used =
'No'");;:. ExecuteCommand (String. Format ("DELETE FROM Technics
WHERE id={0};", gridView. SelectedRows [0]. Cells ["id"].
Value));. ExecuteAndShowDataGrid (gridView, "SELECT * FROM Technics WHERE
Inventarized = 1");;
}
}
// кнопка открытьvoid btnOpenRecord_Click (object sender, EventArgs e)
{. OpenDetailForm (false);
}
}
// двойной клик по списку открывает форму
для просмотра
{. OpenDetailForm (false);
}void OpenDetailForm (bool
isNewObject)
{(_currentList)
{(GridEnum. Employee):.
OpenEmployeeForm (isNewObject);;:. OpenTechnicForm (isNewObject);;
}
}
// открыть список рабоче и неиспользуемой
техники
private void button1_Click
(object sender, EventArgs e)
{. ExecuteAndShowDataGrid
(gridView, "SELECT * FROM Technics WHERE Inventarized = 'No' AND Used =
'No'");
_currentList = GridEnum.
NonUsed;
}
// кнопка создатьvoid btnCreateRecord_Click (object sender, EventArgs e)
{. OpenDetailForm (true);
}void MainForm_Activated (object
sender, EventArgs e)
{(_currentList)
{(GridEnum. Employee):.
ExecuteAndShowDataGrid (gridView, "SELECT * FROM
employee");;(GridEnum. Technics):. ExecuteAndShowDataGrid (gridView,
"SELECT * FROM Technics");;(GridEnum. NonUsed):.
ExecuteAndShowDataGrid (gridView, "SELECT * FROM Technics WHERE
Inventarized = 'No' AND Used = 'No'");;:. ExecuteAndShowDataGrid
(gridView, "SELECT * FROM Technics WHERE Inventarized = 1");;
}
}
}
}
Program. cs
{class Program
{
// / <summary>
// / Точка входа.
// / </summary>
[STAThread]void Main ()
{(! File. Exists
("TechnicsDB. db"))();. EnableVisualStyles ();.
SetCompatibleTextRenderingDefault (false);.run (new MainForm ());
}
// / <summary>
// / Создание базы данных и генерация
данных.
// / </summary>void CreateDB ()
{
// создание таблицы сотрудников
string createEmpl = @"DROP
TABLE IF EXISTS employee;TABLE employee (INTEGER PRIMARY KEY
AUTOINCREMENT,TEXT,TEXT,TEXT,TEXT,TEXT);INTO employee (FirstName, LastName,
Position, BirthDate, Technic)('Ivan', 'Nosov', 'Manager', '01.03.1985',
'PC-1002');INTO employee (FirstName, LastName, Position, BirthDate,
Technic)('Leonid', 'Satin', 'Worker', '04.10.1970', 'PC-2024');INTO employee (FirstName,
LastName, Position, BirthDate, Technic)('Elena', 'Vasilieva', 'Worker',
'09.12.1990', 'PC-1206');INTO employee (FirstName, LastName, Position,
BirthDate, Technic)('Petr', 'Osinin', 'Worker', '26.02.1995', 'PC-3245');INTO
employee (FirstName, LastName, Position, BirthDate, Technic)('Nikolai',
'Losev', 'Manager', '16.03.1978', 'PC-1134');INTO employee (FirstName,
LastName, Position, BirthDate, Technic)('Evgenij', 'Filatov', 'Director',
'02.09.1979', 'PC-1364');INTO employee (FirstName, LastName, Position,
BirthDate, Technic)('Tamara', 'Dolina', 'Worker', '09.11.1991', 'PC-7811');INTO
employee (FirstName, LastName, Position, BirthDate, Technic)('Anton',
'Stepanov', 'Worker', '22.01.1992', 'PC-9912');INTO employee (FirstName,
LastName, Position, BirthDate, Technic)('Vladimir', 'Kazakov', 'Manager',
'01.01.1986', 'PC-4551');INTO employee (FirstName, LastName, Position,
BirthDate, Technic)('Svetlana', 'Andreeva', 'Worker', '14.11.1976',
'PC-4651');INTO employee (FirstName, LastName, Position, BirthDate, Technic)('Stepan',
'Kozlov', 'Worker', '09.12.1990', 'PC-6453');INTO employee (FirstName,
LastName, Position, BirthDate, Technic)('Ekaterina', 'Loyko', 'Worker',
'26.02.1995', 'PC-3451');INTO employee (FirstName, LastName, Position,
BirthDate, Technic)('Stanislav', 'Vlasov', 'Security', '31.04.1989',
'PC-1278'); ";
// создание таблицы техникиcreateTech = @"DROP TABLE IF EXISTS technics;TABLE technics
(INTEGER PRIMARY KEY AUTOINCREMENT,TEXT,TEXT,TEXT,TEXT);INTO Technics (Name,
Inventarized, ManufacturedAt, Used)('PC-1002', 'No','01.02.2011', 'Yes');INTO
Technics (Name, Inventarized, ManufacturedAt, Used)('PC-2024',
'No','04.01.2012', 'Yes');INTO Technics (Name, Inventarized, ManufacturedAt,
Used)('PC-1206', 'No','23.02.2014', 'Yes');INTO Technics (Name, Inventarized,
ManufacturedAt, Used)('PC-3245', 'No','11.10.2014', 'Yes');INTO Technics (Name,
Inventarized, ManufacturedAt, Used)('PC-1134', 'No','23.02.2013', 'Yes');INTO
Technics (Name, Inventarized, ManufacturedAt, Used)('PC-1890',
'Yes','17.06.2005', 'No');INTO Technics (Name, Inventarized, ManufacturedAt,
Used)('PC-1364', 'No','21.11.2012', 'Yes');INTO Technics (Name, Inventarized,
ManufacturedAt, Used)('PC-7811', 'No','07.02.2013', 'Yes');INTO Technics (Name,
Inventarized, ManufacturedAt, Used)('PC-9912', 'No','01.01.2014', 'Yes');INTO
Technics (Name, Inventarized, ManufacturedAt, Used)('PC-4551',
'No','12.07.2012', 'Yes');INTO Technics (Name, Inventarized, ManufacturedAt,
Used)('PC-4651', 'No','30.12.2014', 'Yes');INTO Technics (Name, Inventarized,
ManufacturedAt, Used)('PC-6453', 'No','29.12.2014', 'Yes');INTO Technics (Name,
Inventarized, ManufacturedAt, Used)('PC-6643', 'Yes','12.08.2004', 'No');INTO
Technics (Name, Inventarized, ManufacturedAt, Used)('PC-3451',
'No','01.02.2011', 'Yes');INTO Technics (Name, Inventarized, ManufacturedAt,
Used)('PC-7777', 'No','11.12.2014', 'No');INTO Technics (Name, Inventarized,
ManufacturedAt, Used)('PC-8888', 'No','17.11.2013', 'No');INTO Technics (Name,
Inventarized, ManufacturedAt, Used)('PC-1278', 'No','01.02.2011', 'Yes');
";. ExecuteCommand (createEmpl);. ExecuteCommand (createTech);
}
}
}
EmployeeForm. cs
{partial class EmployeeForm:
Form
{EmployeeForm ()
{();
}
// разрешить редактирвоаниеvoid EnableEditing (bool value)
{. txtFirstName. ReadOnly =!
value;. txtLastName. ReadOnly =! value;. txtBirthDate. ReadOnly =! value;.
txtPosition. ReadOnly =! value;. txtTechnic. ReadOnly =! value;. btnApplyEmpl.
Visible = value;. btnBrowseTechnic. Visible = value;. btnEditEmpl. Visible =!
value;
}
// заполнить поля формы значениями полей
открываемого объекта сотрудника
public void SetEmployee
(Employee employeeToShow, bool newObject)
{. txtFirstName. Text =
employeeToShow. FirstName;. txtLastName. Text = employeeToShow. LastName;.
txtBirthDate. Text = employeeToShow. BirthDate;. txtPosition. Text =
employeeToShow. Position;. txtTechnic. Text = employeeToShow. Technic;.
EnableEditing (newObject);. gridViewTech. Visible = false;. btnChooseTechnic.
Visible = false;. btnCreateEmpl. Visible = newObject;. btnApplyEmpl. Visible =!
newObject;
}
// кнопка сохранитьvoid btnApplyEmpl_Click (object sender, EventArgs e)
{. EnableEditing (false);.
gridViewTech. Visible = false;. btnChooseTechnic. Visible = false;.
ExecuteCommand (String. Format ("UPDATE technics SET Used = 'No' WHERE
Name = '{0}'", this. _currentTechnic));. Save (false);. gridViewTech.
Visible = false;. btnChooseTechnic. Visible = false;. Size = new Size (530,
230);. Close ();
}
// кнопка изменить
private void btnEditEmpl_Click
(object sender, EventArgs e)
{. EnableEditing (true);
}
// кнопка открыть доступную технику
private void
btnBrowseTechnic_Click (object sender, EventArgs e)
{. ExecuteAndShowDataGrid (this.
gridViewTech, "SELECT * FROM Technics WHERE Inventarized == 'No' AND Used
= 'No'");. Size = new Size (530, 525);. gridViewTech. Visible = true;.
btnChooseTechnic. Visible = true;. btnBrowseTechnic. Visible = false;
}
// кнопка выбратьvoid btnChooseTechnic_Click (object sender, EventArgs e)
{. ChooseTechnic ();
}
// дабл клик по технике в списке
private void
gridViewTech_DoubleClick (object sender, EventArgs e)
{. ChooseTechnic ();
}void ChooseTechnic ()
{
}Technic _technic = null;string
_currentTechnic = String. Empty;string _oldFirstName = String. Empty;string
_oldLastName = String. Empty;
// событие загрузки формы
private void EmployeeForm_Load
(object sender, EventArgs e)
{. _currentTechnic = this.
txtTechnic. Text;. _oldFirstName = this. txtFirstName. Text;. _oldLastName =
this. txtLastName. Text;
}
// кнопка создатьvoid btnCreateEmpl_Click (object sender, EventArgs e)
{
this. btnCreateEmpl. Visible =
false;. EnableEditing (false);. Save (true);. Close ();
}
// кнопка сохранитьvoid Save (bool isNew)
{
// если техника была изменена(_technic! =
null)
{
// если это новый объект, создаем запись в
базе
DBHelper. ExecuteCommand
(String. Format ("UPDATE technics SET Used = 'Yes' WHERE ID = {0}",
_technic. Oid));(isNew). ExecuteCommand (String. Format ("INSERT INTO
employee (FirstName, LastName, Position, BirthDate, Technic) VALUES
('{0}','{1}','{2}','{3}','{4}')", this. txtFirstName. Text, this.
txtLastName. Text, this. txtPosition. Text, this. txtBirthDate. Text, _technic.
Name));
// иначе редактируем существующую. ExecuteCommand (String. Format ("UPDATE employee SET Technic =
'{0}', FirstName = '{1}', LastName = '{2}', Position = '{3}', BirthDate = '{4}'
WHERE FirstName = '{5}' AND LastName = '{6}'", _technic. Name, this.
txtFirstName. Text, this. txtLastName. Text, this. txtPosition. Text, this.
txtBirthDate. Text, this. _oldFirstName, this. _oldLastName));
}
// если это новый объект, создаем запись в
базе
if (isNew). ExecuteCommand
(String. Format ("INSERT INTO employee (FirstName, LastName, Position,
BirthDate, Technic) VALUES ('{0}','{1}','{2}','{3}','{4}')", this.
txtFirstName. Text, this. txtLastName. Text, this. txtPosition. Text, this.
txtBirthDate. Text, ""));
// иначе редактируем существующую. ExecuteCommand (String. Format ("UPDATE employee SET FirstName =
'{0}', LastName = '{1}', Position = '{2}', BirthDate = '{3}' WHERE FirstName =
'{4}' AND LastName = '{5}'", this. txtFirstName. Text, this. txtLastName.
Text, this. txtPosition. Text, this. txtBirthDate. Text, this. _oldFirstName,
this. _oldLastName));
}
}
}