Как сделать регистрацию в wpf приложении
Для взаимодействия приложения с базой данных необходимо в коде класса страницы объявить статическое свойство контекста данных сформированной EDM -модели. Это свойство целесообразно объявлять статическим.
Также необходимо объявить обобщенную коллекцию типа ObservableCollection<Employee> для работы приложения с коллекцией объектов базы данных . Этот тип представляет коллекцию динамических данных, обеспечивающих выдачу уведомления при получении и удалении элементов или при обновлении всего списка. Тип ObservableCollection<Т> находится в пространстве имен System.Collections.ObjectModel, ссылку на которое нужно добавить в объявлении класса приложения .
Экземпляры свойств контекста данных и коллекции необходимо создать в конструкторе класса страницы.
Формирование данных для приложения, которые должны предоставляться из базы данных , буде проводиться при загрузке страницы приложения. Для этого в XAML -документ Page добавьте свойство Loaded.
В код класса страницы приложения включаем обработчик Page_Loaded.
Поле employees имеет тип ObjectQuery<Employee>. Класс ObjectQuery<Т> представляет запрос , возвращающий коллекцию типизированных сущностей с любым количеством элементов. Запрос сформируем с помощью технологии LINQ .
Результаты запроса целесообразно отсортировать, например по фамилии сотрудника ( orderby employee.Surname ). Далее формируем коллекцию объектов базы данных и источник данных для сетки DataGrid.
В результате проектирования в приложении сформирована коллекция с данными из таблицы базы данных .
Необходимо настроить сетку DataGrid для корректного отображения данных.
Модифицируйте общее описание DataGrid.
Модифицированное XAML -описание сетки DataGrid:
Привязка текстового поля
Для каждого текстового столбца задайте свойство привязки Binding. В расширении разметки привязки данного свойства определите свойство класса источника даннных, к которому привязывается колонка. Далее укажите режим двусторонней привязки ( Mode=TwoWay ), который определяет синхронное обновление как источника, так и приемника привязки. Способ обновления источника привязки задается свойством UpdateSourceTrigger, которое принимает значение PropertyChanged, что соответствует немедленному обновлению источника привязки каждый раз при изменении свойства цели привязки.
Привязка выпадающего списка
Привязка данных к колонке типа DataGridComboBoxColumn требует определенной подготовительной работы. Если в таблице модели данных хранится не текстовое значение поля, а внешний ключ для другой таблицы, где находится данные, то в EDM -модели можно получить значение атрибута из связанных таблиц. Для этого используется атрибут связи в таблице EDM -модели.
Например, для обеспечения возможности работы с коллекцией таблицы Title в приложении добавте в проект папку Model и в ней создайте класс ListTitle.
Класс ListTitle наследуется от класса обобщенной коллекции ObservableCollection<T> и его назначение создавать коллекцию объектов Title. Поле titles является запросом типа ObjectQuery<Title>. Данному полю присваивается свойство Titles контекста данных DataEntitiesEmployee, который определен в классе приложения .
Запрос LINQ получает данные из базы данных в поле queryTitle и затем в цикле foreach формируется коллекция класса ListTitle.
Для использования класса ListTitle в XAML -документе класса приложения необходимо объявить данный класс как ресурс. При этом нужно подключить пространство имен WpfApplProject.Model.
Затем определите ресурс страницы с ключом listTitle.
Далее модифицируйте XAML -описание для типа DataGridComboBoxColumn.
Источник выпадающего списка задается как статический ресурс < StaticResource listTitle >. Выводимое в ячейки колонки поле должно соответствовать полю Title1 таблицы Title EDM -модели ( DisplayMemberPath="Title1" ). Выбираемый в списке параметр ( SelectedValueBinding ) должен быть привязан к полю TitleID таблицы Employee.
Выбор в свойства SelectedValueBinding производится по пути определенному свойством SelectedValuePath (SelectedValuePath="ID").
Привязка даты
При привязке даты ставится задача для невыделенной ячейки представлять дату в виде цифр дня, месяца и года, разделенных точками, а для выделенной ячейки – использовать класс для выбора даты.
Решение данной задачи осуществлено с помощью разработки двух шаблонов данных DataTemplate.
В первом шаблоне, для которого задан ключ DateTemplate, используется элемент управления TextBlock, свойство Text которого привязывается к атрибуту BirstDate таблицы Employee. Данные в привязке форматируются свойством StringFormat и строковые данные выравниваются по центру. Этот шаблон используется для визуализации данных в режиме их просмотра.
Второй шаблон с ключом EditingDateTemplate использует класс DatePicker. Этот шаблон используется в режиме редактирования данных.
Разработанные шаблоны необходимо добавить к ресурсам в XAML -документ страницы PageEmployee.
Для настройки колонки "Дата рождения" модифицируем её XAML -описание.
Невыделенную ячейку колонки ( CellTemplate ) свяжите с ресурсом DateTemplate, а редактируемую ячейку ( CellEditingTemplate ) – с ресурсом EditingDateTemplate.
Ячейка столбца для отображения даты типа DataGridTemplateColumn имеет три представления ( рис. 6.17). Если ячейка не выделена, то представление обычное текстовое ( рис. 6.17а). При выделении ячейки прорисовывается свернутое содержание класса DatePicker ( рис. 6.17б). При щелчке на ячейке появляется календарь ( рис. 6.17в).
Задание 5. Разработать методы манипулирования данными – 4 часа.
Для редактирования данных в приложении модифицируйте метод EditCommandBinding_Executed
Свойству IsReadOnly сетки DataGridEmployee присвойте значение false, что обеспечит возможность редактирования строк и ячеек сетки. Далее используйте метод BeginEdit для начала редактирования ячейки, на которую наведен указатель мыши.
Результаты редактирования необходимо сохранить в базе данных. Для этого необходимо вызвать метод SaveCommandBinding_Executed.
В методе SaveCommandBinding_Executed вызывается метод SaveChanges класса dataEntitiesEmployee. Метод SaveChanges сохраняет все обновления в источнике данных.
Для создания новых данных модифицируйте метод NewCommandBinding_Executed.
В методе NewCommandBinding_Executed объект employee класса Employee создается с помощью метода CreateEmployee. В блоке try . catch созданный объект employee добавляется в контекст данных методом AddObject сущности Employees EDM -модели DataEntitiesEmployee, а также в коллекцию ListEmployee.
При инициализации команды создания данных в сетке формируется первоначальная строка с данными " по умолчанию". В сформированную строку необходимо ввести реальные данные сохранить их, вызвав команду "Сохранить".
Для удаления данных по сотруднику используем метод DeleteCommandBinding_Executed.
В методе определяется объект emp класса Employee, который выделен в сетке DataGridEmployee.
При подтверждении операции удаления объект emp удаляется из контекста методом DeleteObject.
Объект emp удаляется из коллекции ListEmployee.
Изменения вносятся в базу данных.
Метод UndoCommandBinding_Executed реализует отмену редактирования последних элементов сетки DataGridEmployee и переводит её в режим просмотра.
Для реализации данной функциональности необходимо провести изменения в коде приложения. Для метода Page_Loaded основной код выделите в метод GetEmployees.
С учетом созданного метода GetEmployees метод Page_Loaded будет иметь следующий вид.
Создайте метод RewriteEmployee, который будет обновлять контекст данных и коллекцию ListEmployee.
С учетом проведенных модификаций кода метод UndoCommandBinding_Executed будет иметь следующий вид.
При запуске команды Отмена будет отменено редактирование в текущей ячейке сетки, а если редактировались несколько ячеек, то при повторном запуске команды будет обновлена вся строка.
Хранить учетные данные на клиенте крайне нежелательно! При регистрации пользователя можете сохранять логин и пароль в вашей БД в виде свертки, к примеру MD5. При авторизации берите свертку от логина и пароля и по сети передавайте уже непосредственно их. Соединение с MSSQL поддерживает SSL. Даже если заснифают и будут ломать шифрование, то выловят свертки, а не сами учетные данные. Также можно предусмотреть принудительную смену пароля (раз в неделю, к примеру)
У вас толстый клиент. Всевозможные системы авторизации для веб-клиентов вам не подходят. Там свои библиотеки, свои протоколы, для поддержки которых придется сильно усложнить приложение.
Естественно, авторизация должна быть своя, а не базы данных. И дело тут вовсе не в безопасности, а в удобстве управления пользователями и их правами. Что делать если вдруг в таблице хранится несколько сущностей, как дать доступ только на одну из них, если права на уровне БД? Как дать доступ на форму ввода (нет соответствующей сущности в БД) и т.д.
Теперь по поводу алгоритма логина пользователя. Достаточно защищать только пароль. Идея в том, чтобы не хранить пароль в чистом виде ни на клиенте, ни на сервере БД (его тоже можно взломать). Имейте в виду, что существуют сервисы преобразования md5 в строку. Возможно стоит использовать какой-нибудь алгоритм получения хэша посложнее. Но и md5 тоже прокатит.
Конечно можно подслушать хэш с другого компьютера. Но чтобы защититься от этого, можно привязать пользователя к IP-адресу. Т.е. знание логина и пароля от другого пользователя становятся бесполезны. Естественно, этот вариант не подходит, если у пользователей нет фиксированных мест.
Шаг 1. Создание базы
Первым делом создадим новую базу данных test для хранения тестовой информации. Добавьте таблицу user со следующими полями:
Шаг 2. Создание проекта
Создайте проект для нового приложения. В Visual Studio для этого нужно зайти в меню File > New > Project .
Создание нового проекта в Visual Studio
После этого появится окно New Project:
Окно New Project в интерфейсе Visual Studio
В поле Name нужно вписать название вашего проекта, в поле Location – указать нужную директорию, в Solution name – ввести название решения. Заполнили данные – нажимаем OK .
Главный класс нового проекта в Visual Studio
Шаг 3. Создание интерфейса
Создайте представление будущей формы авторизации, как показано на рисунке ниже. Добавьте два поля ( username и password ) и кнопку для входа.
Шаг 4. Настройка соединения с базой
Создайте класс connection для настройки соединения с базой. Пример реализации представлен в листинге ниже:
Шаг 5. Код авторизации
Наконец, вернитесь к форме и добавьте следующий код:
Результат
Нажмите F5 , чтобы запустить программу. Если соединение с базой данных успешно установится, вы увидите только что созданную форму.
Интерфейс работающей программы
Для взаимодействия приложения с базой данных необходимо в коде класса страницы объявить статическое свойство контекста данных сформированной EDM -модели. Это свойство целесообразно объявлять статическим.
Также необходимо объявить обобщенную коллекцию типа ObservableCollection<Employee> для работы приложения с коллекцией объектов базы данных . Этот тип представляет коллекцию динамических данных, обеспечивающих выдачу уведомления при получении и удалении элементов или при обновлении всего списка. Тип ObservableCollection<Т> находится в пространстве имен System.Collections.ObjectModel, ссылку на которое нужно добавить в объявлении класса приложения .
Экземпляры свойств контекста данных и коллекции необходимо создать в конструкторе класса страницы.
Формирование данных для приложения, которые должны предоставляться из базы данных , буде проводиться при загрузке страницы приложения. Для этого в XAML -документ Page добавьте свойство Loaded.
В код класса страницы приложения включаем обработчик Page_Loaded.
Поле employees имеет тип ObjectQuery<Employee>. Класс ObjectQuery<Т> представляет запрос , возвращающий коллекцию типизированных сущностей с любым количеством элементов. Запрос сформируем с помощью технологии LINQ .
Результаты запроса целесообразно отсортировать, например по фамилии сотрудника ( orderby employee.Surname ). Далее формируем коллекцию объектов базы данных и источник данных для сетки DataGrid.
В результате проектирования в приложении сформирована коллекция с данными из таблицы базы данных .
Необходимо настроить сетку DataGrid для корректного отображения данных.
Модифицируйте общее описание DataGrid.
Модифицированное XAML -описание сетки DataGrid:
Привязка текстового поля
Для каждого текстового столбца задайте свойство привязки Binding. В расширении разметки привязки данного свойства определите свойство класса источника даннных, к которому привязывается колонка. Далее укажите режим двусторонней привязки ( Mode=TwoWay ), который определяет синхронное обновление как источника, так и приемника привязки. Способ обновления источника привязки задается свойством UpdateSourceTrigger, которое принимает значение PropertyChanged, что соответствует немедленному обновлению источника привязки каждый раз при изменении свойства цели привязки.
Привязка выпадающего списка
Привязка данных к колонке типа DataGridComboBoxColumn требует определенной подготовительной работы. Если в таблице модели данных хранится не текстовое значение поля, а внешний ключ для другой таблицы, где находится данные, то в EDM -модели можно получить значение атрибута из связанных таблиц. Для этого используется атрибут связи в таблице EDM -модели.
Например, для обеспечения возможности работы с коллекцией таблицы Title в приложении добавте в проект папку Model и в ней создайте класс ListTitle.
Класс ListTitle наследуется от класса обобщенной коллекции ObservableCollection<T> и его назначение создавать коллекцию объектов Title. Поле titles является запросом типа ObjectQuery<Title>. Данному полю присваивается свойство Titles контекста данных DataEntitiesEmployee, который определен в классе приложения .
Запрос LINQ получает данные из базы данных в поле queryTitle и затем в цикле foreach формируется коллекция класса ListTitle.
Для использования класса ListTitle в XAML -документе класса приложения необходимо объявить данный класс как ресурс. При этом нужно подключить пространство имен WpfApplProject.Model.
Затем определите ресурс страницы с ключом listTitle.
Далее модифицируйте XAML -описание для типа DataGridComboBoxColumn.
Источник выпадающего списка задается как статический ресурс < StaticResource listTitle >. Выводимое в ячейки колонки поле должно соответствовать полю Title1 таблицы Title EDM -модели ( DisplayMemberPath="Title1" ). Выбираемый в списке параметр ( SelectedValueBinding ) должен быть привязан к полю TitleID таблицы Employee.
Выбор в свойства SelectedValueBinding производится по пути определенному свойством SelectedValuePath (SelectedValuePath="ID").
Привязка даты
При привязке даты ставится задача для невыделенной ячейки представлять дату в виде цифр дня, месяца и года, разделенных точками, а для выделенной ячейки – использовать класс для выбора даты.
Решение данной задачи осуществлено с помощью разработки двух шаблонов данных DataTemplate.
В первом шаблоне, для которого задан ключ DateTemplate, используется элемент управления TextBlock, свойство Text которого привязывается к атрибуту BirstDate таблицы Employee. Данные в привязке форматируются свойством StringFormat и строковые данные выравниваются по центру. Этот шаблон используется для визуализации данных в режиме их просмотра.
Второй шаблон с ключом EditingDateTemplate использует класс DatePicker. Этот шаблон используется в режиме редактирования данных.
Разработанные шаблоны необходимо добавить к ресурсам в XAML -документ страницы PageEmployee.
Для настройки колонки "Дата рождения" модифицируем её XAML -описание.
Невыделенную ячейку колонки ( CellTemplate ) свяжите с ресурсом DateTemplate, а редактируемую ячейку ( CellEditingTemplate ) – с ресурсом EditingDateTemplate.
Ячейка столбца для отображения даты типа DataGridTemplateColumn имеет три представления ( рис. 6.17). Если ячейка не выделена, то представление обычное текстовое ( рис. 6.17а). При выделении ячейки прорисовывается свернутое содержание класса DatePicker ( рис. 6.17б). При щелчке на ячейке появляется календарь ( рис. 6.17в).
Задание 5. Разработать методы манипулирования данными – 4 часа.
Для редактирования данных в приложении модифицируйте метод EditCommandBinding_Executed
Свойству IsReadOnly сетки DataGridEmployee присвойте значение false, что обеспечит возможность редактирования строк и ячеек сетки. Далее используйте метод BeginEdit для начала редактирования ячейки, на которую наведен указатель мыши.
Результаты редактирования необходимо сохранить в базе данных. Для этого необходимо вызвать метод SaveCommandBinding_Executed.
В методе SaveCommandBinding_Executed вызывается метод SaveChanges класса dataEntitiesEmployee. Метод SaveChanges сохраняет все обновления в источнике данных.
Для создания новых данных модифицируйте метод NewCommandBinding_Executed.
В методе NewCommandBinding_Executed объект employee класса Employee создается с помощью метода CreateEmployee. В блоке try . catch созданный объект employee добавляется в контекст данных методом AddObject сущности Employees EDM -модели DataEntitiesEmployee, а также в коллекцию ListEmployee.
При инициализации команды создания данных в сетке формируется первоначальная строка с данными " по умолчанию". В сформированную строку необходимо ввести реальные данные сохранить их, вызвав команду "Сохранить".
Для удаления данных по сотруднику используем метод DeleteCommandBinding_Executed.
В методе определяется объект emp класса Employee, который выделен в сетке DataGridEmployee.
При подтверждении операции удаления объект emp удаляется из контекста методом DeleteObject.
Объект emp удаляется из коллекции ListEmployee.
Изменения вносятся в базу данных.
Метод UndoCommandBinding_Executed реализует отмену редактирования последних элементов сетки DataGridEmployee и переводит её в режим просмотра.
Для реализации данной функциональности необходимо провести изменения в коде приложения. Для метода Page_Loaded основной код выделите в метод GetEmployees.
С учетом созданного метода GetEmployees метод Page_Loaded будет иметь следующий вид.
Создайте метод RewriteEmployee, который будет обновлять контекст данных и коллекцию ListEmployee.
С учетом проведенных модификаций кода метод UndoCommandBinding_Executed будет иметь следующий вид.
При запуске команды Отмена будет отменено редактирование в текущей ячейке сетки, а если редактировались несколько ячеек, то при повторном запуске команды будет обновлена вся строка.
Читайте также: