Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
WPF-практика 7.doc
Скачиваний:
8
Добавлен:
01.07.2025
Размер:
1 Мб
Скачать
☆

Привязка даты

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

Решение данной задачи осуществлено с помощью разработки двух шаблонов данных 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;

}

При запуске команды Отмена будет отменено редактирование в текущей ячейке сетки, а если редактировались несколько ячеек, то при повторном запуске команды будет обновлена вся строка.