# Разное В этой лекции будут свалены материалы, не вошедшие в другие лекции, но всплавшие при решении лабораторных работ * [Всплывающие подсказки](#всплывающие-подсказки) * [Сохранение CSV](#сохранение-csv) * [Выбор из списка с возможностью редактирования](#выбор-из-списка-с-возможностью-редактирования) * [Ввод даты или времени](#ввод-даты-или-времени) ## Всплывающие подсказки Всплывающие подсказки, это блок с дополнительной информацией, появляющийся при наведении курсора на объект. Можно реализовать двумя вариантами: 1. Подсказка **простой текст**: просто добавляем атрибут `ToolTip.Tip` к нашему визуальному элементу ```xml ``` 1. В подсказке хотите показать **сложную комбинацию** (картинка + описание, многострочный текст): добавляем к элементу вложенный тег ```xml ToolTip A control which pops up a hint when a control is hovered ``` Естественно вместо фиксированного текста можете сделать привязку (binding) к вычисляемому свойству класса. ## Сохранение CSV Задача состоит из двух подзадач: - вызов стандартного диалога сохранения для получения полного имени файла - собственно сохранение данных ### Вызов стандартного диалога сохранения ```cs // создание диалога и инициализация var saveFileBox = new SaveFileDialog(); saveFileBox.Title = "Сохранить список мероприятий"; saveFileBox.InitialFileName = "events.csv"; var settingsFileName = await saveFileBox.ShowAsync(this); // если выбор успешный, то в переменной имя целевого файла if (settingsFileName != null) { // тут логика по сохранению данных } ``` ### Сохранение CSV В принципе мы это [проходили на 2-м курсе](https://github.com/kolei/OAP/blob/master/articles/t5_file_types.md#CSV) ```cs // тут копипаста из лекции using (var writer = new StreamWriter(settingsFileName)){ var enCulture = System.Globalization.CultureInfo.GetCultureInfo("en-US"); //TODO тут вставить выбор всех мероприятий из БД и перебор в цикле // строковое поле выводим в кавычках // вместо фиксированных значений вставляем данные из модели writer.WriteLine("{0},{1},\"{2}\"", 1, // дробные числа выводим с точкой 2.0.ToString("0.00", enCulture), "qq"); } ``` ## Выбор из списка с возможностью редактирования Компонент **AutoCompleteBox** выглядит как текстовое поле, но при вводе данных показывает (и позволяет выбрать) варианты из списка: ```xml ``` * cityList - массив строк (либо делаем отдельный список названий городов, либо переопределяем toString) При сохранении смотрим что введено в *autoCompleteBox.Text*, если название есть в списке городов, то сразу берем его `id`, если нет, то сначала добавляем город в базу, потом смотрим на его `id` ## Ввод даты или времени ### DatePicker Для ввода даты можно использовать компонент **DatePicker** (есть еще **CalendarDatePicker**, но его я не копал): ```xml ``` Тип данных для атрибута *SelectedDate*: **DateTimeOffset**, поэтому напрямую поле БД ему скармливать нельзя. Ниже пример для свойства класса окна ```cs public DateTimeOffset currentDate { get; set; } = new DateTimeOffset( DateTime.Now); ``` вы можете при создании окна присвоить текущее значение даты этому свойству, или в вёрстке поменять на геттер *currentUser.bithDayDTO*. Где суффикс **DTO** означает, что это не оригинальное значение даты из базы, а преобразованное в **DateTimeOffset**. И не забыть при сохранении преобразовать обратно в дату. ### TimePicker Для ввода времени можно использовать компонент **TimePicker** (как пользоваться раскопайте сами).