- •Лабораторная работа: Разработка приложения на базе wpf Цель
- •Задание 1. Создать проект в соответствии с шаблоном "приложение wpf" и разработать интерфейс пользователя
- •Задание 2. Разработать бизнес-логику приложения – 2 часа.
- •Задание 3. Создать edm-модель данных – 1 час.
- •Задание 4. Произвести привязку данных к элементам контроля – 2 часа.
- •Привязка текстового поля
- •Привязка выпадающего списка
- •Привязка даты
- •Задание 6. Реализовать валидацию данных – 1 час.
- •Задание 7. Разработать методы поиска данных – 1 час.
- •Варианты заданий
- •Вариант 1. Информационная подсистема ведения счетов клиентов
- •Вариант 2. Информационная подсистема ведения адресов клиентов
- •Вариант 3. Информационная подсистема ведения договоров клиентов
- •Вариант 4. Информационная подсистема ведения клиентов – физических лиц
- •Вариант 5. Информационная подсистема ведения клиентов – юридических лиц
- •Вариант 6. Информационная подсистема учета сделок с ценными бумагами
- •Вариант 7. Информационная подсистема учета ценных бумаг
- •Вариант 8. Информационная подсистема поручений по сделкам с ценными бумагами
- •Вариант 9. Информационная подсистема учета клиентов компании
- •Вариант 10. Информационная подсистема учета операций с ценными бумагами
Привязка даты
При привязке даты ставится задача для невыделенной ячейки представлять дату в виде цифр дня, месяца и года, разделенных точками, а для выделенной ячейки – использовать класс для выбора даты.
Решение данной задачи осуществлено с помощью разработки двух шаблонов данных DataTemplate.
В первом шаблоне, для которого задан ключ DateTemplate, используется элемент управления TextBlock, свойство Text которого привязывается к атрибуту BirstDate таблицы Employee. Данные в привязке форматируются свойством StringFormat и строковые данные выравниваются по центру. Этот шаблон используется для визуализации данных в режиме их просмотра.
<DataTemplate x:Key="DateTemplate" >
<TextBlock Text="{Binding BirstDate,
StringFormat={}{0:dd\.}{0:MM\.}{0:yyyy}}"
VerticalAlignment="Center" HorizontalAlignment="Center" />
</DataTemplate>
Второй шаблон с ключом EditingDateTemplate использует класс DatePicker. Этот шаблон используется в режиме редактирования данных.
<DataTemplate x:Key="EditingDateTemplate">
<DatePicker SelectedDate="{Binding BirstDate, Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged}" />
</DataTemplate>
Разработанные шаблоны необходимо добавить к ресурсам в XAML-документ страницы PageEmployee.
Для настройки колонки "Дата рождения" модифицируем её XAML-описание.
<DataGridTemplateColumn Header="Дата рождения"
CellTemplate="{StaticResource DateTemplate}"
CellEditingTemplate="{StaticResource EditingDateTemplate}" />
Невыделенную ячейку колонки ( CellTemplate ) свяжите с ресурсом DateTemplate, а редактируемую ячейку ( CellEditingTemplate ) – с ресурсом EditingDateTemplate.
Ячейка столбца для отображения даты типа DataGridTemplateColumn имеет три представления ( рис. 6.17). Если ячейка не выделена, то представление обычное текстовое ( рис. 6.17а). При выделении ячейки прорисовывается свернутое содержание класса DatePicker ( рис. 6.17б). При щелчке на ячейке появляется календарь ( рис. 6.17в).
Рис. 6.17. Отображение даты в сетке DataGrid
Задание 5. Разработать методы манипулирования данными – 4 часа.
Для редактирования данных в приложении модифицируйте метод EditCommandBinding_Executed
private void EditCommandBinding_Executed(object sender,
ExecutedRoutedEventArgs e)
{
DataGridEmployee.IsReadOnly = false;
DataGridEmployee.BeginEdit();
isDirty = false;
Свойству IsReadOnly сетки DataGridEmployee присвойте значение false, что обеспечит возможность редактирования строк и ячеек сетки. Далее используйте метод BeginEdit для начала редактирования ячейки, на которую наведен указатель мыши.
Результаты редактирования необходимо сохранить в базе данных. Для этого необходимо вызвать метод SaveCommandBinding_Executed.
private void SaveCommandBinding_Executed(object sender,
ExecutedRoutedEventArgs e)
{
dataEntitiesEmployee.SaveChanges();
isDirty = true;
DataGridEmployee.IsReadOnly = true;
}
В методе SaveCommandBinding_Executed вызывается метод SaveChanges класса dataEntitiesEmployee. Метод SaveChanges сохраняет все обновления в источнике данных.
Для создания новых данных модифицируйте метод NewCommandBinding_Executed.
Например:
private void NewCommandBinding_Executed(object sender,
ExecutedRoutedEventArgs e)
{
Employee employee = Employee.CreateEmployee(-1, "не задано", "не задано",
"не задано", 0);
employee.Telephone = "не задано";
employee.Email = "не задано";
try
{
DataEntitiesEmployee.Employees.AddObject(employee);
ListEmployee.Add(employee);
isDirty = false;
}
catch (DataServiceRequestException ex)
{
throw new ApplicationException(
"Ошибка добавления данных" + ex.ToString());
}
}
В методе NewCommandBinding_Executed объект employee класса Employee создается с помощью метода CreateEmployee. В блоке try ... catch созданный объект employee добавляется в контекст данных методом AddObject сущности Employees EDM-модели DataEntitiesEmployee, а также в коллекцию ListEmployee.
При инициализации команды создания данных в сетке формируется первоначальная строка с данными "по умолчанию". В сформированную строку необходимо ввести реальные данные сохранить их, вызвав команду "Сохранить".
Для удаления данных по сотруднику используем метод DeleteCommandBinding_Executed.
private void DeleteCommandBinding_Executed(object sender,
ExecutedRoutedEventArgs e)
{
Employee emp = DataGridEmployee.SelectedItem as Employee;
if (emp != null)
{
MessageBoxResult result = MessageBox.Show("Удалить данные ",
"Предупреждение", MessageBoxButton.OKCancel);
if (result == MessageBoxResult.OK)
{
DataEntitiesEmployee.DeleteObject(emp);
DataGridEmployee.SelectedIndex =
DataGridEmployee.SelectedIndex == 0 ? 1 : DataGridEmployee.SelectedIndex - 1;
ListEmployee.Remove(emp);
DataEntitiesEmployee.SaveChanges();
}
}
else
{
MessageBox.Show("Выберите строку для удаления");
}
}
В методе определяется объект emp класса Employee, который выделен в сетке DataGridEmployee.
Если объект emp найден, то с помощью диалогового окна класса MessageBoxResult выводится сообщение с данными, которые предполагается удалить.
При подтверждении операции удаления объект emp удаляется из контекста методом DeleteObject.
DataEntitiesEmployee.DeleteObject(emp);
Объект emp удаляется из коллекции ListEmployee.
ListEmployee.Remove(emp);
Изменения вносятся в базу данных.
DataEntitiesEmployee.SaveChanges();
Метод UndoCommandBinding_Executed реализует отмену редактирования последних элементов сетки DataGridEmployee и переводит её в режим просмотра.
Для реализации данной функциональности необходимо провести изменения в коде приложения. Для метода Page_Loaded основной код выделите в метод GetEmployees.
private void GetEmployees()
{
ObjectQuery<Employee> employees = DataEntitiesEmployee.Employees;
var queryEmployee = from employee in employees
orderby employee.Surname
select employee;
foreach (Employee emp in queryEmployee)
{
ListEmployee.Add(emp);
}
DataGridEmployee.ItemsSource = ListEmployee;
}
С учетом созданного метода GetEmployees метод Page_Loaded будет иметь следующий вид.
private void Page_Loaded(object sender, RoutedEventArgs e)
{
GetEmployees();
DataGridEmployee.SelectedIndex = 0;
}
Создайте метод RewriteEmployee, который будет обновлять контекст данных и коллекцию ListEmployee.
private void RewriteEmployee()
{
DataEntitiesEmployee = new TitlePresonalEntities();
ListEmployee.Clear();
GetEmployees();
}
С учетом проведенных модификаций кода метод UndoCommandBinding_Executed будет иметь следующий вид.
private void UndoCommandBinding_Executed(object sender,
ExecutedRoutedEventArgs e)
{
RewriteEmployee();
DataGridEmployee.IsReadOnly = true;
isDirty = true;
}
При запуске команды Отмена будет отменено редактирование в текущей ячейке сетки, а если редактировались несколько ячеек, то при повторном запуске команды будет обновлена вся строка.
