Автоматизированное рабочее место работника регистратуры

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

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 09.10.2013
Размер файла 3,2 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Министерство образование и науки Российской Федерации

Новосибирский Государственный Технический Университет

Курсовая работа

по программированию

«Автоматизированное рабочее место работника регистратуры»

Факультет: АВТ

Преподаватель: Шахмаметов Р. Г.

Группа: АВТ-113

Студент: Николаев В. В.

Новосибирск 2013

ОГЛАВЛЕНИЕ

ВВЕДЕНИЕ

1. ОПИСАНИЕ ОБЪЕКТА АВТОМАТИЗАЦИИ И ТРЕБОВАНИЙ К СОЗДАВАЕМОЙ ПРОГРАММЕ

2. ОСНОВНАЯ ЧАСТЬ

2.1 ОО-анализ

2.2 ОО-проектирование

2.3 ОО-программирование

3. ТЕСТИРОВАНИЕ

ЗАКЛЮЧЕНИЕ

СПИСОК ЛИТЕРАТУРЫ

ПРИЛОЖЕНИЕ

ВВЕДЕНИЕ

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

Кроме того, очень трудоемкой задачей является само ведение журнала приема. Журнал необходимо постоянно держать в актуальном состоянии - обновлять (перерисовывать) график работы врачей и учитывать изменения, если расписание изменилось. В свою очередь, и в штате сотрудников могут произойти изменения, что также отразится в журнале приема.

Таким образом, необходимость в разработке системы автоматизации деятельности работника регистратуры оправдана.

1. ОПИСАНИЕ ОБЪЕКТА АВТОМАТИЗАЦИИ И ТРЕБОВАНИЙ К СОЗДАВАЕМОЙ ПРОГРАММЕ

Разрабатываемая система решает задачу автоматизации основных операций в деятельности оператора отвечающего за оформление записей на прием к врачам.

Список автоматизируемых задач:

· Создание новой базы данных (БД) сотрудников

· Открытие существующей БД

· Сохранение БД на диске

· Добавление нового сотрудника в БД

· Редактирование данных сотрудника в БД

· Удаление сотрудника из БД

· Добавление графика работы (журнала приема) сотрудника

· Изменение графика работы сотрудника

· Добавление пациентов в журнал приема врача

· Обновление журнала приема врача (удаление просроченных записей)

· Сортировка списка сотрудников по фамилии

· Сортировка списка сотрудников по специализации

· Сортировка списка сотрудников по номеру кабинета

· Поиск сотрудников по фамилии

· Поиск пациентов по фамилии

2. ОСНОВНАЯ ЧАСТЬ

2.1 ОО-анализ

При анализе будем руководствоваться следующей диаграммой вариантов использования:

Рис. 1 Диаграмма основных вариантов использования АРМ работника регистратуры

При создании нового врача оператор вносит в БД всю информацию о нем, которая включает: ФИО врача, его специализация, номер кабинета, и график работы.

Таким образом, приходим к введению класса Doctor, моделирующего сотрудника поликлиники.

Такие свойства как ФИО, специализация и номер кабинета класса Doctorможно реализовать стандартными примитивными типами данных платформы.NETFramework.

При реализации компонента графика приема врача ограничимся максимальным сроком возможной записи равным одной неделе.

Данный компонент должен обеспечивать:

· Составление бланка расписания с указанным максимальным временем приема одного пациента

· Автоматическое удаление просроченных записей и заполнение бланка расписания рабочего дня на следующую неделю

· Добавление сведений о пациенте в журнал приема выбранного врача

· Изменение сведений о пациенте в журнале приема выбранного врача

Данный компонент можно декомпозировать на два подкомпонента - класс DayShedule,инкапсулирующий расписание приема на один день, и класс Timetable, агрегирующий класс DayShedule и предоставляющий недельный (максимальный срок, которым мы ограничились) график работы доктора.

Кроме того, для управления базой данных необходимо разработать графический интерфейс пользователя.

Исходя из структуры системы, удобным будет интерфейс с разделением сотрудников поликлиники и их пациентов. Также необходимо предоставить удобную форму для ввода информации о самих сотрудниках и их режиме работы.

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

Рис. 2 Диаграмма последовательности работы в интерфейсе будущей АРМ

В развернутом виде эта диаграмма представлена на рис. 5.

По итогам анализа имеем представление об общей структуре разрабатываемой системы и ее будущем интерфейсе.

В целом, структуру АРМ представляет следующая диаграмма компонентов:

Рис. 3 Диаграмма компонентов

В качестве СУБД остановимся на выборе компонента Binding Source стандартной поставки.NETFramework, т. к. он обеспечивает удобное создание и последующее редактирование сохраняемых в БД сущностей.

Также теперь есть основания предположить будущую аппаратную часть системы:

Рис.4 Диаграмма развертывания системы

Исходя из диаграммы развертывания и диаграммы прецедентов, базу данных удобно разместить на одном из серверов поликлиники, а клиент разрабатываемой АРМ установить непосредственно на рабочие компьютеры операторов и сотрудников больницы.

2.2 ОО-проектирование

На этапе анализа было выявлено три класса, совместная работа которых обеспечит выполнение поставленных задач. Теперь необходимо спроектировать взаимодействие этих классов между собой и определить операции над объектами класса.

Проектирование класса Doctor:

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

Рис. 5 Диаграмма состояний класса Doctor

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

· +BirthDate:DateTime; дата рождения

· +CabinetNumber : Int; номер кабинета

· +Name:String; ФИО

· +Specialization : String; специализация

· + Timetable : Timetable; график приема

Данные свойства предоставляют публичный аксессор (get) и публичный мутатор (set) с добавлением к нему логики проверки значений на корректность.

При редактировании данных сотрудника необходимо обеспечить возможность отмены внесенных изменений, что наталкивает на необходимость имплементации интерфейса ICloneable, возвращающего копию объекта класса. В результате в класс добавляется еще один метод:

· + Clone(); метод, возвращающий копию вызывающего объекта

Так как для сохранения данных был выбран агрегирующий компонент Binding Source, необходимо предоставить возможность создания объектов класса Doctorс полями, значение которых задано по умолчанию. Таким образом, необходимо объявить конструктор без параметров:

· + Doctor()

Класс Doctor связан с классом Timetable композицией.

При проектировании класса Doctor получена следующая диаграмма, иллюстрирующая его интерфейс:

Рис. 6 Диаграмма класса Doctor

Проектирование класса DayShedule:

При проектировании будем использовать следующую диаграмму:

Рис. 7 Диаграмма последовательности работы с классом DayShedule

Класс DayShedule, моделирующий график приема доктора на определенный день недели, и предоставляющий инкапсулированные в нем данные в формате «ключ - значение» (где ключ - время приема, назначенное пациенту, значение - ФИО пациента) удобно унаследовать от класса Dictionary <TimeSpan, string> входящего в стандартную поставку платформы.NET Framework.

Кроме того, в данном классе также необходимо инкапсулировать следующие свойства:

· + Date :DateTime; Дата, следующего рабочего дня

· + DayOfWeek :DayOfWeek; День недели, на который составляется график

· + Duration : TimeSpan; Продолжительность рабочего дня

· + EndTime :TimeSpan; Время окончания рабочего дня

· + Interval :TimeSpan; Время, выделенное на прием одного пациента

· + IsExpired : bool; Просрочен ли график

· + StartTime :TimeSpan; Время начала рабочего дня

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

· + DayShedule; конструктор класса, с передаваемым ему параметром DayOfWeek

· + Set; метод, с помощью которого заполняется расписание в журнале приема

· + SyncDate; метод, синхронизирующий текущую дату с датой в журнале приема

· - ClearTasks; функция, необходимая для очистки просроченных записей. Вызывается в методе SyncDate

· - ListDate; функция, для установления следующей даты дня недели, на который составляется данное расписание

Так как данный класс наследуются от Dictionary<TimeSpan, string>, также необходимо переопределить следующие методы и конструкторы базового класса:

· # DayShedule(Serialization Info); конструктор, необходимый для десериализации объектов класса

· + GetObjectData; метод, необходимый для сериализации объектов класса

Класс DayShedule - вспомогательная единица инкапсуляции, используемая для обеспечения работы других классов, разрабатываемой системы.

В ходе проектирования класса, получили следующую диаграмму его интерфейса:

Рис. 8 Диаграмма класса DayShedule

Проектирование класса Timetable:

Класс Timetable создан для агрегации объектов класса DaySheduleи моделирует график работы врача на неделю.

Для использования средств работы с коллекциями LINQ платформы.NETFramework, реализуем в данном классе интерфейс

IEnumerable<DayShedule>. Данный интерфейс позволяет организовать простую итерацию по объектам DayShedule,и также (с использованием LINQ) осуществлять поиск и сортировку коллекции.

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

· + Monday : DayShedule

· + Tuesday : DayShedule

· + Wednesday : DayShedule

· + Thursday : DayShedule

· + Friday : DayShedule

· + Saturday : DayShedule

· + Sunday : DayShedule

Данные свойства хранятся в приватном поле _days :List<DayShedule>

Методы, инкапсулированные в данном классе:

· Timetable; конструктор по умолчанию

· Sync; метод, синхронизирующий дату каждого дня графика с текущей датой

· this[]; перегруженный оператор индексирования

Для имплементации интерфейса IEnumerable<DayShedule> необходимо реализовать два метода:

· + GetEnumerator;

· - IEnumerable.GetEnumerator;

Объект класса Timetableхранится в каждом экземпляре класса Doctor. Таким образом, мы имеем отношение композиция между классами.

Диаграмма, иллюстрирующая интерфейс класса Timetable:

Рис. 9 Диаграмма класса Timetable

На этом этап проектирования можно закончить. Его результатом является получение полного представления о структуре разрабатываемой системы, интерфейсах необходимых классов и их взаимодействии.

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

Рис. 10 Диаграмма классов

2.3 ОО-программирование

Использование базовых принципов ООП:

Наследование:

КлассDayShedule наследуется от типа платформы.NETFramework Dictionary<TimeSpan, string>, в итоге DayShedule также унаследует все реализованные интерфейсы базового класса, такие как:

· IDictionary; предоставляет элементы коллекции в виде «ключ - значение»

· ICollection; определяет методы, используемые для управления коллекциями

· IEnumerable; предоставляет методы для простого перебор элементов в коллекции

· ISerializable; позволяет объекту управлять его собственной сериализацией и десериализацией

Класс Timetableнаследует интерфейс IEnumerable и переопределяет его виртуальные методы.

Класс Doctorреализует интерфейс ICloneable

Инкапсуляция:

Инкапсулированными переменными классов являются все публичные свойства этих классов.

Там, где это было возможно, использовались такие средства инкапсуляция ЯПC# как автоматические свойства. В остальных случаях добавлялись дополнительные поля классов, обработкой которых занимались явно заданные свойства с необходимыми проверками в мутаторе.

Обработка исключений:

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

Оператор throw использовался при попытке задать некорректное значение свойству класса. Блоки try/catch использовались для облегчения обработки некорректного ввода, и в случае выброшенного исключения, с помощью этих блоков пользователю предоставлялась информация о произошедшей ошибке.

3. ТЕСТИРОВАНИЕ

На выбор: открытие ранее созданной базы данных или создание новой

Рис. 11 Начальный экран работы программы

Меню работы с персоналом:

Рис. 12 Инструменты работы с персоналом

Добавление сотрудника

В меню, показанном на рис. 12 выберем пункт «Добавить»

Рис. 13 Редактирование данных

Рис. 14 Составление графика приема врача

Добавление пациента

В главном окне программе, выберем необходимого врача

Рис. 15 Выбор, на какой день записываем пациента

Рис. 16 Добавление данных пациента

Поиск

Рис. 17 Возможные способы поиска

регистратура врач автоматизированный рабочий

Сортировка

Рис. 18 Возможные способы сортировки

Удаление сотрудника

В главном окне выберем сотрудника, которого хотим удалить, затем в меню «Сотрудники» выберем пункт «Удалить»

Рис. 19 Удаление сотрудника

ЗАКЛЮЧЕНИЕ

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

В качестве парадигмы программирования была выбрана концепция ООП. Были использованы такие полезные средства, предоставляемые в рамках этой концепции, как: наследование, инкапсуляция, композиция и агрегация классов.

Разработанное приложение, хотя и позволяет выполнять основные функции работника регистратуры, на данном этапе не позволяет выполнять следующие функции:

· Авторизация в системе и разделение привилегий пользователей

· Сохранение истории болезни пациента

· Дополнительные сведения о пациенте

· Предоставление отчетности о количестве обслуженных пациентов, проведенном лечении и процедурах

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

СПИСОК ЛИТЕРАТУРЫ

1. Э. Троелсен. Язык программирования С# 2010 и платформа.NET 4.0, 5-е изд.И.Д. Вильямс, 2011. - 1392 с.

2. Н. Трей. C# 2010: Ускоренный курс для профессионалов. И.Д. Вильямс, 2010. - 592 с.

3. Фаулер М., Скотт К. UML. Основы. Символ-Плюс, 2002. - 192 с.

4. Кватрани Т. Rational Rose и UML. Визуальное моделирование. ДМК Пресс, 2001. - 176 с.

ПРИЛОЖЕНИЕ

Листинг программы

Класс Doctor

#region Namespace directives

usingSystem;

usingSystem.Text.RegularExpressions;

usingVictor.Timetable;

#endregion

namespaceRegistry

{

[Serializable]

publicclassDoctor : ICloneable

{

#region Fields

privateDateTime_birthDate;

privateint_cabinetNumber;

privatestring_name;

privatestring_specialization;

#endregion

#region Constructors

publicDoctor()

{

Timetable = newTimetable();

}

publicDoctor(string name,

DateTime birthDate,

string speciality,

int cabinetNumber,

Timetable timetable)

: this()

{

Name = name;

BirthDate = birthDate;

Specialization = speciality;

CabinetNumber = cabinetNumber;

Timetable = timetable;

}

#endregion

#region Properties

publicTimetableTimetable { get; privateset; }

publicstringName

{

get { return_name; }

set

{

value = value.Trim();

if(!Regex.IsMatch(value, @"^[А-я]+\s+([А-я]\.\s*){2}$"))

thrownewArgumentException("ФИО врача задано неверно");

_name = value;

}

}

publicDateTimeBirthDate

{

get { return_birthDate; }

set

{

if((DateTime.Today-value).TotalDays< 6564) //18 лет

thrownewArgumentException("Дата рождения задана неверно");

_birthDate = value;

}

}

publicstringSpecialization

{

get { return_specialization; }

set

{

value = value.Trim();

if(!Regex.IsMatch(value, @"^[А-я]+$"))

thrownewArgumentException("Специальность задана неверно");

_specialization = value;

}

}

publicintCabinetNumber

{

get { return_cabinetNumber; }

set

{

if(value<= 0)

thrownewArgumentException("Номер кабинета должен быть больше ноля");

_cabinetNumber = value;

}

}

#endregion

#region Implementation of ICloneable

publicobjectClone()

{

returnnewDoctor(_name, _birthDate, _specialization, _cabinetNumber, Timetable);

}

#endregion

}

}

КлассTimetable

#region Namespace directives

usingSystem;

usingSystem.Collections;

usingSystem.Collections.Generic;

usingSystem.Linq;

#endregion

namespaceVictor.Timetable

{

[Serializable]

publicclassTimetable : IEnumerable<DayShedule>

{

#region Fields and properties

publicreadonlyDaySheduleFriday;

publicreadonlyDaySheduleMonday;

publicreadonlyDaySheduleSaturday;

publicreadonlyDaySheduleSunday;

publicreadonlyDaySheduleThursday;

publicreadonlyDaySheduleTuesday;

publicreadonlyDaySheduleWednesday;

privatereadonlyList<DayShedule>_days;

#endregion

#region Constructors

publicTimetable()

{

Monday = newDayShedule(DayOfWeek.Monday);

Tuesday = newDayShedule(DayOfWeek.Tuesday);

Wednesday = newDayShedule(DayOfWeek.Wednesday);

Thursday = newDayShedule(DayOfWeek.Thursday);

Friday = newDayShedule(DayOfWeek.Friday);

Saturday = newDayShedule(DayOfWeek.Saturday);

Sunday = newDayShedule(DayOfWeek.Sunday);

_days = newList<DayShedule>

{

Monday,

Tuesday,

Wednesday,

Thursday,

Friday,

Saturday,

Sunday

};

}

#endregion

#region Indexers

publicDayShedulethis[int index]

{

get { return_days[index]; }

}

#endregion

#region Public methods

publicvoidRemoveExpired()

{

foreach (DaySheduledayinthis)

day.SyncDate();

}

#endregion

#region Implementation of IEnumerable

publicIEnumerator<DayShedule>GetEnumerator()

{

return_days.Where(t => t.IsSet).GetEnumerator();

}

IEnumeratorIEnumerable.GetEnumerator()

{

returnGetEnumerator();

}

#endregion

}

}

КлассDayShedule

#region Namespace directives

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Linq;

usingSystem.Runtime.Serialization;

#endregion

namespaceVictor.Timetable

{

[Serializable]

publicclassDayShedule : Dictionary<TimeSpan, string>

{

#region properties

publicDayOfWeekDayOfWeek { get; privateset; }

publicDateTimeDate { get; privateset; }

publicTimeSpanStartTime { get; privateset; }

publicTimeSpanEndTime { get; privateset; }

publicTimeSpanDuration { get; privateset; }

publicTimeSpanInterval { get; privateset; }

publicboolIsSet { get; privateset; }

publicboolIsExpired

{

get { returnDateTime.Today>Date; }

}

#endregion

#region Constructors

protectedDayShedule(SerializationInfo info, StreamingContext context)

: base(info, context)

{

DayOfWeek = (DayOfWeek) info.GetValue("DayOfWeek", typeof (DayOfWeek));

IsSet = info.GetBoolean("IsSet");

if(!IsSet)

return;

Date = info.GetDateTime("Date");

StartTime = (TimeSpan) info.GetValue("StartTime", typeof (TimeSpan));

EndTime = (TimeSpan) info.GetValue("EndTime", typeof (TimeSpan));

Duration = (TimeSpan) info.GetValue("Duration", typeof (TimeSpan));

Interval = (TimeSpan) info.GetValue("Interval", typeof (TimeSpan));

}

publicDayShedule(DayOfWeek day)

{

DayOfWeek = day;

}

#endregion

#region Public Methods

publicvoidSet(TimeSpan startTime, TimeSpan endTime, TimeSpan interval)

{

if(startTime.Days> 0)

thrownewArgumentException("Начальное время задано неверно");

if(endTime.Days> 0)

thrownewArgumentException("Конечное время задано неверно");

if(startTime >= endTime)

thrownewArgumentException("Начальное время должно быть больше конечного");

StartTime = startTime;

EndTime = endTime;

Duration = EndTime-StartTime;

if(interval >Duration)

thrownewArgumentException("Интервал превышает рабочий промежуток");

IsSet = true;

Interval = interval;

SetNextDateOfDayOfWeek();

Clear();

TimeSpanfloatBound = StartTime;

while(floatBound<EndTime)

{

Add(floatBound, string.Empty);

floatBound+= interval;

}

}

publicvoidUnset()

{

IsSet = false;

}

publicvoidSyncDate()

{

if(IsExpired)

{

double delta = (DateTime.Today-Date).TotalDays/7;

var factor = (int) (Math.Abs((int) delta - delta) <double.Epsilon

? delta

: delta + 1);

Date+=newTimeSpan(factor*7, 0, 0, 0);

ClearTasks();

}

}

#endregion

#region Private methods

privatevoidClearTasks()

{

foreach (TimeSpantimeinKeys.ToList())

this[time] = string.Empty;

}

privatevoidSetNextDateOfDayOfWeek()

{

Date = DateTime.Today;

while(Date.DayOfWeek != DayOfWeek)

Date = Date.AddDays(1);

}

#endregion

#region Overrides of Dictionary<TimeSpan,string>

publicoverridevoidGetObjectData(SerializationInfo info, StreamingContext context)

{

base.GetObjectData(info, context);

info.AddValue("DayOfWeek", DayOfWeek);

info.AddValue("IsSet", IsSet);

if(!IsSet)

return;

info.AddValue("Date", Date);

info.AddValue("StartTime", StartTime);

info.AddValue("EndTime", EndTime);

info.AddValue("Duration", Duration);

info.AddValue("Interval", Interval);

}

#endregion

}

}

Логика классаForm1

#region Namespace directives

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Data;

usingSystem.IO;

usingSystem.Linq;

usingSystem.Runtime.Serialization.Formatters.Binary;

usingSystem.Text.RegularExpressions;

usingSystem.Windows.Forms;

usingRegistry.Properties;

usingVictor.Timetable;

#endregion

namespaceRegistry

{

publicpartialclassForm1 : Form

{

#region Fields

privatereadonlyBinaryFormatter_bf = newBinaryFormatter();

privatereadonlyDoctorForm_doctorForm = newDoctorForm();

privatereadonlySearchDialog_search = newSearchDialog();

privatereadonlyList<TimeSpan>_journal = newList<TimeSpan>();

privatereadonlyList<string>_rusDayOfWeeks;

privateint_dayIndex;

privateDoctor_selectedDoctor;

privateList<Doctor>Doctors

{

get { return ((List<Doctor>) db.List); }

}

#endregion

#region Constructors

publicForm1()

{

InitializeComponent();

db.DataSource = newList<Doctor>();

_rusDayOfWeeks = newList<string>

{

"Понедельник",

"Вторник",

"Среда",

"Четверг",

"Пятница",

"Суббота",

"Воскресенье"

};

}

#endregion

#region Private methods

// устанавливает рабочий график врача (дни приема)

privatevoidSetDateOfReception(Doctor doctor, int rowIndex)

{

var cell = newDataGridViewComboBoxCell();

var data = newDataTable();

data.Columns.Add(newDataColumn("Description", typeof (string)));

data.Columns.Add(newDataColumn("Value", typeof (DateTime)));

intworkDay = -1;

for (inti = 0; i< 7; i++)

{

if(!doctor.Timetable[i].IsSet)

continue;

data.Rows.Add(_rusDayOfWeeks[i], doctor.Timetable[i].Date);

if(workDay == -1)

workDay = i;

}

cell.DataSource = data;

cell.DisplayMember = "Description";

cell.ValueMember = "Value";

doctorsTable[3, rowIndex] = cell;

doctorsTable[3, rowIndex].Value = doctor.Timetable[workDay].Date;

}

privatevoidSaveData(string path)

{

if(path == string.Empty || doctorsTable.RowCount == 0)

return;

using (FileStream fs = File.OpenWrite(path))

_bf.Serialize(fs, db.DataSource);

}

privatevoidSyncTable()

{

inti = 0;

foreach (Doctordoctorindb)

{

doctor.Timetable.RemoveExpired();

SetDateOfReception(doctor, i);

++i;

}

doctorsTable.Refresh();

}

privatevoidSort(Comparison<Doctor> comparison)

{

Doctors.Sort(comparison);

SyncTable();

}

privatevoidSortByName()

{

Sort((x, y) =>String.Compare(x.Name, y.Name, StringComparison. OrdinalIgnoreCase));

}

privatevoidSortBySpecialization()

{

Sort((x, y) =>

String.Compare(x.Specialization,

y.Specialization,

StringComparison.OrdinalIgnoreCase));

}

privatevoidSortByCabinetNumber()

{

Sort((x, y) => x.CabinetNumber - y.CabinetNumber);

}

#endregion

#region Events

privatevoidsortByName_Click(object sender, EventArgs e)

{

SortByName();

}

privatevoidForm1_FormClosing(object sender, FormClosingEventArgs e)

{

DialogResult dr = MessageBox.Show(Resources.IsSaveNeeded,

Resources.Exit,

MessageBoxButtons.YesNoCancel);

if(dr == DialogResult.Cancel)

e.Cancel = true;

elseif(dr == DialogResult.Yes)

{

if(saveFileDialog1.ShowDialog() == DialogResult.OK)

SaveData(saveFileDialog1.FileName);

}

}

privatevoidForm1_Load(object sender, EventArgs e)

{

tabControl1.TabPages.Remove(tabPage2);

}

privatevoidedit1_Click(object sender, EventArgs e)

{

if(doctorsTable.Rows.Count<= 0)

{

MessageBox.Show(Resources.ChooseDoctor,

Resources.Error,

MessageBoxButtons.OK,

MessageBoxIcon.Error);

return;

}

object tmpDoctor = ((Doctor) db.Current).Clone();

var doctor = (Doctor) db.Current;

int idx = doctorsTable.CurrentRow.Index;

_doctorForm.EditDoctor(doctor);

if(!_doctorForm.IsSaveNeeded)

{

db[idx] = tmpDoctor;

return;

}

SortByName();

doctorsTable.Refresh();

}

privatevoidadd1_Click(object sender, EventArgs e)

{

var doctor = (Doctor) db.AddNew();

_doctorForm.AddDoctor(doctor);

if(!_doctorForm.IsSaveNeeded)

db.RemoveCurrent();

elseif(doctorsTable.RowCount> 0)

{

if(!tabControl1.Contains(tabPage2))

tabControl1.TabPages.Add(tabPage2);

SortByName();

}

doctorsTable.Refresh();

}

privatevoidfile1_DropDownOpening(object sender, EventArgs e)

{

save1.Enabled = doctorsTable.RowCount> 0;

}

privatevoidnew1_Click(object sender, EventArgs e)

{

SaveData(saveFileDialog1.FileName);

db.DataSource = newList<Doctor>();

saveFileDialog1.FileName = string.Empty;

tabControl1.TabPages.Remove(tabPage2);

doctorsTable.Refresh();

}

privatevoidopen_Click(object sender, EventArgs e)

{

openFileDialog1.FileName = string.Empty;

if(openFileDialog1.ShowDialog() != DialogResult.OK)

return;

tabControl1.TabPages.Remove(tabPage2);

SaveData(saveFileDialog1.FileName);

string path = openFileDialog1.FileName;

using (FileStream fs = File.OpenRead(path))

db.DataSource = _bf.Deserialize(fs);

saveFileDialog1.FileName = path;

if(doctorsTable.RowCount> 0)

{

SyncTable();

tabControl1.TabPages.Add(tabPage2);

}

doctorsTable.Refresh();

}

privatevoidsave_Click(object sender, EventArgs e)

{

if(saveFileDialog1.ShowDialog() == DialogResult.OK)

SaveData(saveFileDialog1.FileName);

}

privatevoiddelete_Click(object sender, EventArgs e)

{

DialogResult dr = MessageBox.Show(Resources.AreYouSure,

Resources.Remove,

MessageBoxButtons.YesNo);

if(dr == DialogResult.Yes)

db.RemoveCurrent();

if(doctorsTable.RowCount< 1)

tabControl1.TabPages.Remove(tabPage2);

doctorsTable.Refresh();

}

privatevoidactions1_DropDownOpening(object sender, EventArgs e)

{

edit.Enabled = delete1.Enabled = doctorsTable.RowCount> 0;

}

privatevoidjournal_Enter(object sender, EventArgs e)

{

journal.Rows.Clear();

_journal.Clear();

DataGridViewRow currentRow = doctorsTable.CurrentRow;

string day = currentRow.Cells[3].FormattedValue.ToString();

_dayIndex = _rusDayOfWeeks.IndexOf(day);

_selectedDoctor = (Doctor) db.Current;

DayShedule dayShedule = _selectedDoctor.Timetable[_dayIndex];

journalHeader.Text = string.Format("{0}, {1}, {2}",

_selectedDoctor.Name,

_rusDayOfWeeks[_dayIndex],

dayShedule.Date.ToString("d.MM.yyyy"));

foreach (varentryin dayShedule)

{

journal.Rows.Add(entry.Key.ToString(@"hh\:mm"), entry.Value);

_journal.Add(entry.Key);

}

}

privatevoidexit_Click(object sender, EventArgs e)

{

Close();

}

privatevoidjournal_CellValidating(object sender,

DataGridViewCellValidatingEventArgs e)

{

if(e.ColumnIndex != 1)

return;

string patientName = e.FormattedValue.ToString();

DayShedule dayShedule = _selectedDoctor.Timetable[_dayIndex];

TimeSpan time = _journal[e.RowIndex];

string error = string.Empty;

if(patientName != string.Empty&&

!Regex.IsMatch(patientName, @"^[А-я]+\s+([А-я]\.\s*){2}$"))

error = "ФИОвведеноневерно";

journal.CurrentRow.ErrorText = error;

if(error != string.Empty)

e.Cancel = true;

else

dayShedule[time] = patientName;

}

privatevoidSortBySpeciaization_Click(object sender, EventArgs e)

{

SortBySpecialization();

}

privatevoidSortByCabinetNumberMenu_Click(object sender, EventArgs e)

{

SortByCabinetNumber();

}

privatevoiddoctorsTable_ColumnHeaderMouseClick(object sender,

DataGridViewCellMouseEventArgs e)

{

switch (e.ColumnIndex)

{

case 0:

SortByName();

break;

case 1:

SortBySpecialization();

break;

case 2:

SortByCabinetNumber();

break;

}

}

#endregion

privatevoidfindDoctor_Click(object sender, EventArgs e)

{

string query = _search.OpenDialog();

if(query != string.Empty)

{

int index = Doctors.FindIndex(d => d.Name.Contains(query));

if(index > 0)

db.Position = index;

}

}

privatevoidfindPatient_Click(object sender, EventArgs e)

{

string query = _search.OpenDialog().ToLower();

if(query != string.Empty)

{

int index =

Doctors.FindIndex(doctor =>

doctor.Timetable

.FirstOrDefault(

shedule =>

shedule.Values

.Where(s => !string.IsNullOrWhiteSpace(s))

.FirstOrDefault(s =>

s.ToLower()

.Contains(query)) != null)

!= null);

if(index > 0)

{

db.Position = index;

tabControl1.SelectedTab = tabPage2;

}

}

}

}

}

Логика класса DoctorForm

#region Namespace directives

usingSystem;

usingSystem.Linq;

usingSystem.Windows.Forms;

#endregion

namespaceRegistry

{

publicpartialclassDoctorForm : Form

{

#region Fields and Properties

privatereadonlybool[] _settedRows = newbool[7];

privateDoctor_doctor;

privateTimeSpan_interval;

publicboolIsSaveNeeded { get; privateset; }

#endregion

#region Public Methods

publicDoctorForm()

{

InitializeComponent();

#region TabPage1

info.Rows.Add(4);

info[0, 0].Value = "ФИО";

info[0, 1].Value = "Датарождения";

info[0, 2].Value = "Специализация";

info[0, 3].Value = "Кабинет";

#endregion

#region TabPage2

timetable.Rows.Add(8);

timetable[0, 0].Value = "Понедельник";

timetable[0, 1].Value = "Вторник";

timetable[0, 2].Value = "Среда";

timetable[0, 3].Value = "Четверг";

timetable[0, 4].Value = "Пятница";

timetable[0, 5].Value = "Суббота";

timetable[0, 6].Value = "Воскресенье";

timetable[0, 7].Value = "Время на пациента";

timetable[2, 7].ReadOnly = true;

#endregion

Clear("Необходимо ввести данные");

}

publicvoidAddDoctor(Doctor doctor)

{

_doctor = doctor;

ShowDialog();

}

publicvoidEditDoctor(Doctor doctor)

{

_doctor = doctor;

Clear(string.Empty);

info[1, 0].Value = _doctor.Name;

info[1, 1].Value = _doctor.BirthDate.ToString("d.MM.yyyy");

info[1, 2].Value = _doctor.Specialization;

info[1, 3].Value = _doctor.CabinetNumber;

inti = 0;

for (; i< 7; i++)

{

if(!_doctor.Timetable[i].IsSet)

continue;

timetable[1, i].Value = _doctor.Timetable[i].StartTime. ToString (@"hh\:mm");

timetable[2, i].Value = _doctor.Timetable[i].EndTime.ToString (@"hh\:mm");

}

i = 0;

while(!_doctor.Timetable[i].IsSet)

++i;

_interval = _doctor.Timetable[i].Interval;

timetable[1, 7].Value = _interval.ToString(@"mm");

ShowDialog();

}

#endregion

#region private Methods

privatevoidClear(string errorText)

{

//очистка инфо

for (inti = 0; i<info.RowCount; i++)

{

info[1, i].Value = info[1, i].DefaultNewRowValue;

info.Rows[i].ErrorText = errorText;

}

//очистка графика

int count = timetable.RowCount - 1;

for (inti = 0; i< count; i++)

{

_settedRows[i] = false;

timetable[1, i].Value = timetable[1, i].DefaultNewRowValue;

timetable[2, i].Value = timetable[2, i].DefaultNewRowValue;

timetable.Rows[i].ErrorText = string.Empty;

}

timetable[1, 7].Value = timetable[1, 7].DefaultNewRowValue;

timetable.Rows[7].ErrorText = errorText;

info.CurrentCell = info[1, 0];

timetable.CurrentCell = timetable[1, 0];

}

privateboolIsRowsValid()

{

if(info.Rows.Cast<DataGridViewRow>()

.Any(row => row.ErrorText != string.Empty))

returnfalse;

returntimetable.Rows.Cast<DataGridViewRow>()

.All(row => row.ErrorText == string.Empty);

}

privateboolPrepareForSetTimetable()

{

for (inti = 0; i< 7; i++)

{

if(timetable.Rows[i].ErrorText != string.Empty)

returnfalse;

if(timetable[1, i].FormattedValue.ToString() != string.Empty&&

timetable[2, i].FormattedValue.ToString() != string.Empty)

_settedRows[i] = true;

}

returntimetable.Rows[7].ErrorText == string.Empty;

}

privatevoidSetTimetable()

{

if(!PrepareForSetTimetable())

return;

bool hasSettedRows = false, hasErrors = false;

for (inti = 0; i< 7; i++)

{

if(!_settedRows[i])

{

if(_doctor.Timetable[i].IsSet)

_doctor.Timetable[i].Unset();

continue;

}

try

{

_doctor.Timetable[i].Set(

TimeSpan.Parse(timetable[1, i].FormattedValue.ToString()),

TimeSpan.Parse(timetable[2, i].FormattedValue.ToString()),

_interval);

hasSettedRows = true;

timetable.Rows[i].ErrorText = string.Empty;

}

catch (Exception exception)

{

hasErrors = true;

timetable.Rows[i].ErrorText = exception.Message;

}

}

if(hasErrors)

return;

if(!hasSettedRows)

timetable.Rows[0].ErrorText = "Необходимо установить хотя бы один день";

}

#endregion

#region Events

privatevoidinfo_CellValidating(object sender, DataGridViewCellValidating EventArgs e)

{

string s = e.FormattedValue.ToString();

switch (e.RowIndex)

{

case 0:

try

{

_doctor.Name = s;

info.Rows[e.RowIndex].ErrorText = string.Empty;

}

catch (ArgumentException exception)

{

info.Rows[e.RowIndex].ErrorText = exception.Message;

}

break;

case 1:

try

{

DateTime tmpDate = Convert.ToDateTime(s);

_doctor.BirthDate = tmpDate;

info.Rows[e.RowIndex].ErrorText = string.Empty;

}

catch (Exception exception)

{

info.Rows[e.RowIndex].ErrorText = exception.Message;

}

break;

case 2:

try

{

_doctor.Specialization = s;

info.Rows[e.RowIndex].ErrorText = string.Empty;

}

catch (ArgumentException exception)

{

info.Rows[e.RowIndex].ErrorText = exception.Message;

}

break;

case 3:

try

{

_doctor.CabinetNumber = Convert.ToInt32(s);

info.Rows[e.RowIndex].ErrorText = string.Empty;

}

catch (Exception exception)

{

info.Rows[e.RowIndex].ErrorText = exception.Message;

}

break;

default:

thrownewNotImplementedException("Something wrong");

}

}

privatevoidtimetable_CellValidating(object sender,

DataGridViewCellValidatingEventArgs e)

{

if(e.ColumnIndex == 0)

return;

if(e.RowIndex == 7)

{

if(e.ColumnIndex == 2)

return;

int parsed;

if(!int.TryParse(e.FormattedValue.ToString(), out parsed))

{

timetable.CurrentRow.ErrorText = "Значение введено неверно";

return;

}

if(parsed < 15)

{

timetable.CurrentRow.ErrorText = "Значение должно быть не менее 15 минут";

return;

}

if(parsed > 60)

{

timetable.CurrentRow.ErrorText = "Значение должно быть не более 60 минут";

return;

}

_interval = newTimeSpan(0, 0, parsed, 0);

timetable.Rows[e.RowIndex].ErrorText = string.Empty;

return;

}

string s = e.FormattedValue.ToString();

TimeSpan tmp;

if(s != string.Empty&& (!TimeSpan.TryParse(s, out tmp) || tmp.Days> 0))

{

timetable.CurrentRow.ErrorText = "Значение введено неверно";

return;

}

timetable.Rows[e.RowIndex].ErrorText = string.Empty;

}

privatevoidDoctorForm_FormClosing(object sender, FormClosing Event Args e)

{

if(info.CurrentCell.IsInEditMode)

{

e.Cancel = true;

info.CurrentRow.ErrorText = "Необходимо завершить редактирование";

return;

}

if(timetable.CurrentCell.IsInEditMode)

{

e.Cancel = true;

timetable.CurrentRow.ErrorText = "Необходимо завершить редактирование";

return;

}

DialogResultdr = MessageBox.Show("Сохранить результаты работы?", "Выйти",

MessageBoxButtons.YesNoCancel);

SetTimetable();

if(dr == DialogResult.Cancel)

{

e.Cancel = true;

return;

}

IsSaveNeeded = dr == DialogResult.Yes;

if(IsSaveNeeded)

{

if(!IsRowsValid())

{

e.Cancel = true;

return;

}

}

Clear("Необходимо ввести данные");

}

#endregion

}

}

Логика класса SearchDialog

#region Namespace directives

usingSystem;

usingSystem.Windows.Forms;

#endregion

namespaceRegistry

{

publicpartialclassSearchDialog : Form

{

publicSearchDialog()

{

InitializeComponent();

}

privatestring_query;

internalstringOpenDialog()

{

textBox1.Text = string.Empty;

ShowDialog();

textBox1.Capture = true;

return_query;

}

privatevoidbutton1_Click(object sender, EventArgs e)

{

SetQuery();

}

privatevoidSetQuery()

{

_query = textBox1.Text;

textBox1.Capture = false;

Close();

}

privatevoidtextBox1_KeyDown(object sender, KeyEventArgs e)

{

if(e.KeyCode == Keys.Enter)

SetQuery();

}

}

}

Представление формы Form1

namespaceRegistry

{

partialclassForm1

{

///<summary>

/// Требуется переменная конструктора.

///</summary>

privateSystem.ComponentModel.IContainercomponents = null;

///<summary>

/// Освободить все используемые ресурсы.

///</summary>

///<param name="disposing">истинно, если управляемый ресурс должен быть удален; иначе ложно.</param>

protectedoverridevoidDispose(bool disposing)

{

if (disposing && (components != null))

{

components.Dispose();

}

base.Dispose(disposing);

}

#region Код, автоматически созданный конструктором форм Windows

///<summary>

/// Обязательный метод для поддержки конструктора - не изменяйте

/// содержимое данного метода при помощи редактора кода.

///</summary>

privatevoidInitializeComponent()

{

this.components = newSystem.ComponentModel.Container();

System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = newSystem.Windows.Forms.DataGridViewCellStyle();

this.doctorsTable = newSystem.Windows.Forms.DataGridView();

this.name = newSystem.Windows.Forms.DataGridViewTextBoxColumn();

this.specialization = newSystem.Windows.Forms.DataGridViewTextBox Column();

this.cabinetNumber = newSystem.Windows.Forms.DataGridViewTextBox Column();

this.workDays = newSystem.Windows.Forms.DataGridViewCombo Box Column();

this.db = newSystem.Windows.Forms.BindingSource(this.components);

this.menuStrip1 = newSystem.Windows.Forms.MenuStrip();

this.file1 = newSystem.Windows.Forms.ToolStripMenuItem();

this.new1 = newSystem.Windows.Forms.ToolStripMenuItem();

this.open1 = newSystem.Windows.Forms.ToolStripMenuItem();

this.save1 = newSystem.Windows.Forms.ToolStripMenuItem();

this.exit1 = newSystem.Windows.Forms.ToolStripMenuItem();

this.actions1 = newSystem.Windows.Forms.ToolStripMenuItem();

this.add1 = newSystem.Windows.Forms.ToolStripMenuItem();

this.edit = newSystem.Windows.Forms.ToolStripMenuItem();

this.delete1 = newSystem.Windows.Forms.ToolStripMenuItem();

this.инструментыToolStripMenuItem = newSystem.Windows.Forms.Tool StripMenuItem();

this.SortStrip = newSystem.Windows.Forms.ToolStripMenuItem();

this.sortByNameMenu = newSystem.Windows.Forms.ToolStripMenuItem();

this.SortBySpeciaizationMenu = newSystem.Windows.Forms.ToolStrip MenuItem();

this.SortByCabinetNumberMenu = newSystem.Windows.Forms.ToolStrip MenuItem();

this.поискToolStripMenuItem = newSystem.Windows.Forms.ToolStrip MenuItem();

this.докторToolStripMenuItem = newSystem.Windows.Forms.ToolStrip MenuItem();

this.пациентToolStripMenuItem = newSystem.Windows.Forms.ToolStrip MenuItem();

this.openFileDialog1 = newSystem.Windows.Forms.OpenFileDialog();

this.saveFileDialog1 = newSystem.Windows.Forms.SaveFileDialog();

this.tabControl1 = newSystem.Windows.Forms.TabControl();

this.tabPage1 = newSystem.Windows.Forms.TabPage();

this.tabPage2 = newSystem.Windows.Forms.TabPage();

this.journal = newSystem.Windows.Forms.DataGridView();

this.time1 = newSystem.Windows.Forms.DataGridViewTextBoxColumn();

this.patient1 = newSystem.Windows.Forms.DataGridViewTextBox Column();

this.journalHeader = newSystem.Windows.Forms.Label();

((System.ComponentModel.ISupportInitialize)(this.doctorsTable)).BeginInit();

((System.ComponentModel.ISupportInitialize)(this.db)).BeginInit();

this.menuStrip1.SuspendLayout();

this.tabControl1.SuspendLayout();

this.tabPage1.SuspendLayout();

this.tabPage2.SuspendLayout();

((System.ComponentModel.ISupportInitialize)(this.journal)).BeginInit();

this.SuspendLayout();

//

// doctorsTable

//

this.doctorsTable.AllowUserToAddRows = false;

this.doctorsTable.AllowUserToDeleteRows = false;

this.doctorsTable.AllowUserToResizeColumns = false;

this.doctorsTable.AllowUserToResizeRows = false;

this.doctorsTable.AutoGenerateColumns = false;

this.doctorsTable.AutoSizeColumnsMode = System.Windows.Forms. DataGridViewAutoSizeColumnsMode.Fill;

this.doctorsTable.BackgroundColor = System.Drawing.SystemColors. ButtonFace;

this.doctorsTable.ColumnHeadersHeightSizeMode = System.Windows. Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;

this.doctorsTable.Columns.AddRange(newSystem.Windows.Forms.DataGridViewColumn[] {

this.name,

this.specialization,

this.cabinetNumber,

this.workDays});

this.doctorsTable.DataSource = this.db;

this.doctorsTable.Dock = System.Windows.Forms.DockStyle.Fill;

this.doctorsTable.Location = newSystem.Drawing.Point(3, 3);

this.doctorsTable.MultiSelect = false;

this.doctorsTable.Name = "doctorsTable";

this.doctorsTable.RowHeadersWidthSizeMode = System.Windows.Forms.DataGridViewRowHeadersWidthSizeMode.DisableResizing;

this.doctorsTable.RowTemplate.Height = 23;

this.doctorsTable.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;

this.doctorsTable.Size = newSystem.Drawing.Size(504, 217);

this.doctorsTable.TabIndex = 0;

this.doctorsTable.ColumnHeaderMouseClick+=newSystem.Windows.Forms.DataGridViewCellMouseEventHandler(this.doctorsTable_ColumnHeaderMouseClick);

//

// name

//

this.name.DataPropertyName = "Name";

this.name.HeaderText = "Врач";

this.name.Name = "name";

this.name.ReadOnly = true;

//

// specialization

//

this.specialization.DataPropertyName = "Specialization";

this.specialization.HeaderText = "Специализация";

this.specialization.Name = "specialization";

this.specialization.ReadOnly = true;

//

// cabinetNumber

//

this.cabinetNumber.DataPropertyName = "CabinetNumber";

this.cabinetNumber.HeaderText = "Номеркабинета";

this.cabinetNumber.Name = "cabinetNumber";

this.cabinetNumber.ReadOnly = true;

//

// workDays

//

this.workDays.HeaderText = "День";

this.workDays.Name = "workDays";

//

// db

//

this.db.DataSource = typeof(Registry.Doctor);

this.db.Filter = "";

this.db.Sort = "";

//

// menuStrip1

//

this.menuStrip1.Items.AddRange(newSystem.Windows.Forms.ToolStripItem[] {

this.file1,

this.actions1,

this.инструментыToolStripMenuItem});

this.menuStrip1.Location = newSystem.Drawing.Point(0, 0);

this.menuStrip1.Name = "menuStrip1";

this.menuStrip1.Size = newSystem.Drawing.Size(518, 24);

this.menuStrip1.TabIndex = 1;

this.menuStrip1.Text = "menuStrip1";

//

// file1

//

this.file1.DropDownItems.AddRange(newSystem.Windows.Forms.ToolStripItem[] {

this.new1,

this.open1,

this.save1,

this.exit1});

this.file1.Name = "file1";

this.file1.Size = newSystem.Drawing.Size(48, 20);

this.file1.Text = "&Файл";

this.file1.DropDownOpening+=newSystem.EventHandler(this.file1_DropDownOpening);

//

// new1

//

this.new1.Name = "new1";

this.new1.Size = newSystem.Drawing.Size(132, 22);

this.new1.Text = "&Новый";

this.new1.Click+=newSystem.EventHandler(this.new1_Click);

//

// open1

//

this.open1.Name = "open1";

this.open1.Size = newSystem.Drawing.Size(132, 22);

this.open1.Text = "&Открыть";

this.open1.Click+=newSystem.EventHandler(this.open_Click);

//

// save1

//

this.save1.Name = "save1";

this.save1.Size = newSystem.Drawing.Size(132, 22);

this.save1.Text = "&Сохранить";

this.save1.Click+=newSystem.EventHandler(this.save_Click);

//

// exit1

//

this.exit1.Name = "exit1";

this.exit1.Size = newSystem.Drawing.Size(132, 22);

this.exit1.Text = "&Выход";

this.exit1.Click+=newSystem.EventHandler(this.exit_Click);

//

// actions1

//

this.actions1.DropDownItems.AddRange(newSystem.Windows.Forms.ToolStripItem[] {

this.add1,

this.edit,

this.delete1});

this.actions1.Name = "actions1";

this.actions1.Size = newSystem.Drawing.Size(85, 20);

this.actions1.Text = "&Сотрудники";

this.actions1.DropDownOpening+=newSystem.EventHandler(this.actions1_DropDownOpening);

//

// add1

//

this.add1.Name = "add1";

this.add1.Size = newSystem.Drawing.Size(154, 22);

this.add1.Text = "&Добавить";

this.add1.Click+=newSystem.EventHandler(this.add1_Click);

//

// edit

//

this.edit.Name = "edit";

this.edit.Size = newSystem.Drawing.Size(154, 22);

this.edit.Text = "&Редактировать";

this.edit.Click+=newSystem.EventHandler(this.edit1_Click);

//

// delete1

//

this.delete1.Name = "delete1";

this.delete1.Size = newSystem.Drawing.Size(154, 22);

this.delete1.Text = "&Удалить";

this.delete1.Click+=newSystem.EventHandler(this.delete_Click);

//

// инструментыToolStripMenuItem

//

this.инструментыToolStripMenuItem.DropDownItems.AddRange(newSystem.Windows.Forms.ToolStripItem[] {

this.SortStrip,

this.поискToolStripMenuItem});

this.инструментыToolStripMenuItem.Name = "инструментыToolStrip Menu Item";

this.инструментыToolStripMenuItem.Size = newSystem.Drawing.Size(95, 20);

this.инструментыToolStripMenuItem.Text = "&Инструменты";

//

// SortStrip

//

this.SortStrip.DropDownItems.AddRange(newSystem.Windows.Forms.ToolStripItem[] {

this.sortByNameMenu,

this.SortBySpeciaizationMenu,

this.SortByCabinetNumberMenu});

this.SortStrip.Name = "SortStrip";

this.SortStrip.Size = newSystem.Drawing.Size(162, 22);

this.SortStrip.Text = "&Сортировать по";

//

// sortByNameMenu

//

this.sortByNameMenu.Name = "sortByNameMenu";

this.sortByNameMenu.Size = newSystem.Drawing.Size(171, 22);

this.sortByNameMenu.Text = "&Имени";

this.sortByNameMenu.Click+=newSystem.EventHandler(this.sortByName_Click);

//

// SortBySpeciaizationMenu

//

this.SortBySpeciaizationMenu.Name = "SortBySpeciaizationMenu";

this.SortBySpeciaizationMenu.Size = newSystem.Drawing.Size(171, 22);

this.SortBySpeciaizationMenu.Text = "&Специализации";

this.SortBySpeciaizationMenu.Click+=newSystem.EventHandler(this.SortBySpeciaization_Click);

//

// SortByCabinetNumberMenu

//

this.SortByCabinetNumberMenu.Name = "SortByCabinetNumberMenu";

this.SortByCabinetNumberMenu.Size = newSystem.Drawing.Size(171, 22);

this.SortByCabinetNumberMenu.Text = "&Номер у кабинета";

this.SortByCabinetNumberMenu.Click+=newSystem.EventHandler(this.SortByCabinetNumberMenu_Click);

//

// поискToolStripMenuItem

//

this.поискToolStripMenuItem.DropDownItems.AddRange(newSystem.Windows.Forms.ToolStripItem[] {

this.докторToolStripMenuItem,

this.пациентToolStripMenuItem});

this.поискToolStripMenuItem.Name = "поискToolStripMenuItem";

this.поискToolStripMenuItem.Size = newSystem.Drawing.Size(162, 22);

this.поискToolStripMenuItem.Text = "&Поиск";

//

// докторToolStripMenuItem

//

this.докторToolStripMenuItem.Name = "докторToolStripMenuItem";

this.докторToolStripMenuItem.Size = newSystem.Drawing.Size(152, 22);

this.докторToolStripMenuItem.Text = "&Доктор";

this.докторToolStripMenuItem.Click+=newSystem.EventHandler(this.findDoctor_Click);

//

// пациентToolStripMenuItem

//

this.пациентToolStripMenuItem.Name = "пациентToolStripMenuItem";

this.пациентToolStripMenuItem.Size = newSystem.Drawing.Size(152, 22);

this.пациентToolStripMenuItem.Text = "&Пациент";

this.пациентToolStripMenuItem.Click+=newSystem.EventHandler(this.findPatient_Click);

//

// openFileDialog1

//

this.openFileDialog1.DefaultExt = "regdb";

this.openFileDialog1.FileName = "openFileDialog1";

this.openFileDialog1.Filter = "Doctor data bases |*.regdb";

//

// saveFileDialog1

//

this.saveFileDialog1.DefaultExt = "regdb";

this.saveFileDialog1.Filter = "Doctor data files |*.regdb";

//

// tabControl1

//

this.tabControl1.Controls.Add(this.tabPage1);

this.tabControl1.Controls.Add(this.tabPage2);

this.tabControl1.Dock = System.Windows.Forms.DockStyle.Fill;

this.tabControl1.Location = newSystem.Drawing.Point(0, 24);

this.tabControl1.Name = "tabControl1";

this.tabControl1.SelectedIndex = 0;

this.tabControl1.Size = newSystem.Drawing.Size(518, 249);

this.tabControl1.TabIndex = 2;

//

// tabPage1

//

this.tabPage1.Controls.Add(this.doctorsTable);

this.tabPage1.Location = newSystem.Drawing.Point(4, 22);

this.tabPage1.Name = "tabPage1";

this.tabPage1.Padding = newSystem.Windows.Forms.Padding(3);

this.tabPage1.Size = newSystem.Drawing.Size(510, 223);

this.tabPage1.TabIndex = 0;

this.tabPage1.Text = "Сотрудники";

this.tabPage1.UseVisualStyleBackColor = true;

//

// tabPage2

//

this.tabPage2.Controls.Add(this.journal);

this.tabPage2.Controls.Add(this.journalHeader);

this.tabPage2.Location = newSystem.Drawing.Point(4, 22);

this.tabPage2.Name = "tabPage2";

this.tabPage2.Padding = newSystem.Windows.Forms.Padding(3);

this.tabPage2.Size = newSystem.Drawing.Size(510, 223);

this.tabPage2.TabIndex = 1;

this.tabPage2.Text = "Журнал";

this.tabPage2.UseVisualStyleBackColor = true;

this.tabPage2.Enter+=newSystem.EventHandler(this.journal_Enter);

//

// journal

//

this.journal.AllowUserToAddRows = false;

this.journal.AllowUserToDeleteRows = false;

this.journal.AllowUserToResizeColumns = false;

this.journal.AllowUserToResizeRows = false;

this.journal.AutoSizeColumnsMode = System.Windows.Forms.DataGrid ViewAutoSizeColumnsMode.Fill;

this.journal.ColumnHeadersHeightSizeMode = System.Windows.Forms. DataGridViewColumnHeadersHeightSizeMode.AutoSize;

this.journal.Columns.AddRange(newSystem.Windows.Forms.DataGridViewColumn[] {

this.time1,

this.patient1});

this.journal.Dock = System.Windows.Forms.DockStyle.Fill;

this.journal.Location = newSystem.Drawing.Point(3, 20);

this.journal.MultiSelect = false;

this.journal.Name = "journal";

this.journal.RowHeadersWidthSizeMode = System.Windows.Forms. DataGridViewRowHeadersWidthSizeMode.DisableResizing;

this.journal.RowTemplate.Height = 23;

this.journal.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;

this.journal.Size = newSystem.Drawing.Size(504, 200);

this.journal.TabIndex = 0;

this.journal.CellValidating+=newSystem.Windows.Forms.DataGridViewCellValidatingEventHandler(this.journal_CellValidating);

//

// time1

//

this.time1.AutoSizeMode = System.Windows.Forms.DataGridViewAuto Size ColumnMode.None;

this.time1.DataPropertyName = "Keys";

dataGridViewCellStyle1.NullValue = null;

this.time1.DefaultCellStyle = dataGridViewCellStyle1;

this.time1.FillWeight = 45F;

this.time1.HeaderText = "Время";

this.time1.Name = "time1";

this.time1.ReadOnly = true;

this.time1.Resizable = System.Windows.Forms.DataGridViewTriState. False;

this.time1.SortMode = System.Windows.Forms.DataGridViewColumn SortMode. NotSortable;

this.time1.Width = 45;

//

// patient1

//

this.patient1.DataPropertyName = "Values";

this.patient1.FillWeight = 149.2386F;

this.patient1.HeaderText = "Пациент";

this.patient1.Name = "patient1";

//

// journalHeader

//

this.journalHeader.Dock = System.Windows.Forms.DockStyle.Top;

this.journalHeader.Location = newSystem.Drawing.Point(3, 3);

this.journalHeader.Name = "journalHeader";

this.journalHeader.Size = newSystem.Drawing.Size(504, 17);

this.journalHeader.TabIndex = 1;

this.journalHeader.Text = "journalHeader";

//

// Form1

//

this.AutoScaleDimensions = newSystem.Drawing.SizeF(6F, 13F);

this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;

this.ClientSize = newSystem.Drawing.Size(518, 273);

this.Controls.Add(this.tabControl1);

this.Controls.Add(this.menuStrip1);

this.MainMenuStrip = this.menuStrip1;

this.MinimumSize = newSystem.Drawing.Size(534, 312);

this.Name = "Form1";

this.StartPosition = System.Windows.Forms.FormStartPosition. CenterScreen;

this.Text = "Регистратура";

this.FormClosing+=newSystem.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing);

this.Load+=newSystem.EventHandler(this.Form1_Load);

((System.ComponentModel.ISupportInitialize)(this.doctorsTable)).EndInit()


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.