Практическое занятие 8

 

Тема: Работа с датами и временем.

Цель работы: получить практические навыки по использованию функций для работы с датой/временем. Отработать навыки использования компонентов для работы с датами.

 

Ход работы

 

Создайте учебную форму для проверки возможностей работы с датами и временем.

 

 

Указания: для формы задайте свойства: Text='Работа с датами', FormBorderStyle=FixedSingle, MaximizeBox=false, StartPosition=CenterScreen.

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

 

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

 

 

Указания: Нанесите на форму компонент StatusStrip. На созданной панели с помощью кнопки создайте два компонента StatusLabel. Для каждого компонента задайте свойства: AutoSize = false, Text очистить, Size - Width = задайте так, чтобы компоненты заполнили всю строку статуса.

 

В событии Load формы напишем команду отображения текущей даты.

 

void MainFormLoad(object sender, EventArgs e)

{

    toolStripStatusLabel2.Text=DateTime.Now.ToString("Сегодня: dddd dd/MM/yyyy HH:mm:ss");

}

 

Время должно обновляться каждую секунду. Для этого нанесите на форму компонент Timer. В его событии Tick введите код:

 

void Timer1Tick(object sender, EventArgs e)

{

    toolStripStatusLabel2.Text=DateTime.Now.ToString("Сегодня: dddd dd/MM/yyyy HH:mm:ss");

}

 

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

 

Указания: нанесите на форму компонент GroupBox и задайте свойство Text='Задание 1 (поиск)'. На панели разместите два компонента DataTimePicker. По умолчанию в календарях даты отображаются в полном формате: имена месяцев записаны полностью. Для отображения даты в обычном формате задайте для календаря свойство Format=short.

Для отображения в компонентах значений, указанных в задании в событие Load формы добавьте команды:

 

//описываем переменную и записываем в нее первое число текущего месяца

DateTime d=new DateTime(DateTime.Today.Year,DateTime.Today.Month,1);

//в первом календаре отображаем сформированное выше значение

dateTimePicker1.Value=d;

//во втором календаре отображаем текущую дату

dateTimePicker2.Value=DateTime.Today.Date;

 

Пусть имеется текстовый файл, в котором записаны некоторые показатели в формате

 

дата    число1    число2    число3

 

Необходимо реализовать функцию, при которой в поле Memo выдаются только те данные из файла, даты которых попадают в заданный диапазон. При этом те строки, которые не попадают в интевал, в файле помечаются значком "-" в конце строки.

 

Указания: В текстовом редакторе создайте такой файл и сохраните на диске. На панели разместите компонент TextBox и задайте свойства: MultiLine=true, ScrollBars=Vertical, Text очистить.

Внизу разместите две кнопки Button  и в свойстве Text задайте надписи на них.

Для открытия текстового файла нанесите на форму компонент OpenFileDialog и задайте свойство Filter=Текстовые файлы|*.txt.

 

Для работы с файлами подключите пространство имен

 

using System.IO;

 

Для первой кнопки напишем код:

 

void Button1Click(object sender, EventArgs e)

{

    //если начало диапазона превышает конец, то конец подпрограммы

    if (dateTimePicker1.Value>dateTimePicker2.Value) return;

 

    //если пользователь в диалоге не выбрал файл, то конец подпрограммы

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

    //переменные для имени файла и для чтения из файла

    string file, s;

    //записываем в переменную имя выбранного в диалоге файла

    file = openFileDialog1.FileName;

    //загружаем в память выбранный файл для чтения

    StreamReader sr = new StreamReader(file);

    //создаем временный файл "temp" для записи

    StreamWriter sw = new StreamWriter("temp");

    //пока не достигнут конец файла

    while (!sr.EndOfStream)

    {

        //считываем в переменную строку из файла

        s=sr.ReadLine();

        //для выделения даты из строки используем метод строковых переменных s.Substring(0,10)

        //начиная с 0 позиции выделяем 10 символов      

        //если первые десять символов в строке (дата) попадают в диапазон дат

        if (Convert.ToDateTime(s.Substring(0,10))>=dateTimePicker1.Value

            && Convert.ToDateTime(s.Substring(0,10))<=dateTimePicker2.Value)

        {

            //строка отображается в поле на форме

            textBox1.AppendText(s+Environment.NewLine);

            //строка записывается во временный файл без изменений

            sw.WriteLine(s);

        }

        //в противном случае, если дата не попадает в диапазон

        else

            //строка записывается во временный файл с добавлением "-"

            sw.WriteLine(s+"-");

        }

    //закрываем файлы

    sr.Close();

    sw.Close();

    //удаляем исходный файл

    File.Delete(file);

    //переименовываем временный файл под исходным именем

    File.Move ("temp", file);

}

 

Для второй кнопки напишите код:

 

void Button2Click(object sender, EventArgs e)

{

    //описываем переменную и записываем в нее первое число текущего месяца

    DateTime d=new DateTime(DateTime.Today.Year,DateTime.Today.Month,1);

    //в первом календаре отображаем сформированное выше значение

    dateTimePicker1.Value=d;

    //во втором календаре отображаем текущую дату

    dateTimePicker2.Value=DateTime.Today.Date;

    //очищаем текстовое поле

    textBox1.Clear();

    //ставим фокус в первый календарь

    dateTimePicker1.Focus();

}

 

Создайте панель для вычисления диапазона даты/времени.

 

Указания: нанесите на форму компонент GroupBox и задайте свойство Text='Задание 2 (диапазоны)'. На панели разместите два компонента DateTimePicker. Для отображения даты в обычном формате задайте для календаря свойство Format=short.

Как и ранее, в первом поле отобразим первый день текущего месяца, а во втром - текущую дату. Для этого в событие Load формы добавьте команды:

 

//третий календарь равен дате первого календаря

dateTimePicker3.Value=dateTimePicker1.Value;

//четвертый календарь равен дате второго календаря

dateTimePicker4.Value=dateTimePicker2.Value;

 

Ниже разместите компонент GroupBox  (Standard) и задайте свойство Text='Расчет диапазона'.  Для создания переключателей нанесите на форму 3 компонента RadioButton и в свойстве Text задайте названия переключателей. Для задания активным первого переключателя задайте свойство Checked=true.

 

Разместите текстовое поле TextBox для отображения результата. Задайте свойства: ReadOnly=true, Text очистить.

Разместите кнопку Button. В свойстве Text укажите надпись на кнопке.

 

Для кнопки введите код:

 

void Button3Click(object sender, EventArgs e)

{

    //если начало диапазона превышает конец, то конец подпрограммы

    if (dateTimePicker3.Value>dateTimePicker4.Value) return;

 

    //если выбран первый переключатель

    if (radioButton1.Checked)

        //в поле показываем разницу в днях

        textBox2.Text=(dateTimePicker4.Value.Date-dateTimePicker3.Value.Date).TotalDays.ToString();

    //если выбран второй переключатель

    else if (radioButton2.Checked)

        //в поле показываем разницу в часах

        textBox2.Text=(dateTimePicker4.Value.Date-dateTimePicker3.Value.Date).TotalHours.ToString();

    //если выбран третий переключатель

    else if (radioButton3.Checked)

        //в поле показываем разницу в минутах

        textBox2.Text=(dateTimePicker4.Value.Date-dateTimePicker3.Value.Date).TotalMinutes.ToString();

}

 

Реализуйте возможность изменения даты на указанное количество лет, месяцев или дней. При этом результат выводится в форматах в разных форматах.

 

 

Указания: нанесите на форму компонент GroupBox и задайте свойство Text='Задание 3 (расчет)'. На панели разместите компонент DateTimePicker.Для отображения даты в обычном формате задайте для календаря свойство Format=short.

Для отображения в нем текущей даты в событие Load формы добавьте команду:

 

//пятый календарь равен дате первого календаря

dateTimePicker5.Value=dateTimePicker1.Value;

 

Разместите текстовое поле TextBox для ввода значения изменения даты. Очистите свойство Text.

 

Ниже разместите компонент GroupBox и задайте свойство Text='Вид расчета'. Для создания переключателей нанесите на форму 3 компонента RadioButton и в свойстве Text задайте названия переключателей. Для задания активным первого переключателя задайте свойство Checked=true.

Рядом разместите еще один компонент GroupBox и задайте свойство Text='Формат вывода'. Для создания переключателей нанесите на форму 3 компонента RadioButton и в свойстве Text задайте названия переключателей. Для задания активным первого переключателя задайте свойство Checked=true.

 

Разместите текстовое поле TextBox для отображения результата. Задайте свойства: ReadOnly=true, Text очистить.

Разместите кнопку Button. В свойстве Text укажите надпись на кнопке.

 

Для кнопки введите код:

 

void Button3Click(object sender, EventArgs e)

{

    //переменная для записи результата

    DateTime rez=new DateTime();

   

    //если выбран первый переключатель в группе "Вид расчета"

    if (radioButton4.Checked)

        //к значению календаря добавляем заданное число лет

        rez=dateTimePicker5.Value.AddYears(Convert.ToInt16(textBox3.Text));

    //иначе, если выбран второй переключатель в группе "Вид расчета"

    else if (radioButton5.Checked)

        //к значению календаря добавляем заданное число месяцев

        rez=dateTimePicker5.Value.AddMonths(Convert.ToInt16(textBox3.Text));

    //иначе, если выбран третий переключатель в группе "Вид расчета"

    else if (radioButton6.Checked)

        //к значению календаря добавляем заданное число дней

        rez=dateTimePicker5.Value.AddDays(Convert.ToInt16(textBox3.Text));
    

    //если выбран первый переключатель в группе "Формат вывода"

    if (radioButton7.Checked)

        //выведем ответ в первом формате

        textBox4.Text=rez.ToString("dd/MM/yyyy");

    //иначе, если выбран второй переключатель в группе "Формат вывода"

    else if (radioButton8.Checked)

        //выведем ответ во втором формате

        textBox4.Text=rez.ToString("#MM'/'dd'/'yyyy#");

    //иначе, если выбран третий переключатель в группе "Формат вывода"

    else if (radioButton9.Checked)

        //выведем ответ в третьем формате

        textBox4.Text=rez.ToString("yyyy-MM-dd");

}