В целом, я хочу заполнить представление таблицы данных данными из двух разных таблиц из базы данных. Этого легко достичь, но в одной из таблиц есть поля с именами StartData, StopData и Day. Что я на самом деле хочу сделать, так это заполнить это представление таблицы данных данными, которые имеют StartDate и StopDate (или одну дату, что означает «День») в диапазоне, заданном двумя датчиками выбора времени и времени, один для даты начала и один для даты окончания.
Итак, у меня есть база данных с двумя таблицами: города и планирование.
Первая таблица (Города) имеет IdCity (идентификатор города) и Имя (название города). Второй имеет IdPlan (идентификатор определенного плана), IdCity (идентификатор города), частоту (случайную, годовую, ежемесячную), StartDate (если частота случайная), StopDate (если частота случайная), день (если частота) является ежегодным или ежемесячным).
Хорошо, сейчас у нас все хорошо с базой данных, давайте посмотрим, что содержит форма. Существует DataGridView, 2x DateTimePicker (один для даты начала и один для даты окончания) и кнопка для запуска события.
Когда кнопка будет нажата, DataGridView будет заполнен столбцами: Имя (из городов), StartDate, StopDate, Frequency. Если частота годовая или месячная, StartDate будет таким же, как и StopDate.
Я написал код, который заполняет представление таблицы данных данными из двух разных таблиц, вот оно:
void populateDataGridView()
{
SqlConnection con = new SqlConnection();
con.ConnectionString = @"connectionString";
con.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandText = "SELECT Cities.Name, Planning.StartDate, Planning.StopDate, Planning.Frequency, Planning.Day FROM Cities,Planning WHERE Cities.IdCity=Planning.IdCity";
DataTable dt = new DataTable();
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(dt);
dataGridView1.DataSource = dt;
cmd.Dispose();
con.Close();
}
Я также написал код для выбора только дат, которые находятся в заданном интервале.
void fitInInterval()
{
DateTime dateStart = Convert.ToDateTime(dateTimePicker1.Text);
DateTime dateStop = Convert.ToDateTime(dateTimePicker2.Text);
// the month
int startdm = Convert.ToInt32(startDate.Month); // startDateMonth
int dstartm = Convert.ToInt32(dateStart.Month);
int stopdm = Convert.ToInt32(stopDate.Month);
int dstopm = Convert.ToInt32(dateStop.Month);
// the days
int startdd = Convert.ToInt32(startDate.Day); // startDateDay
int dstartd = Convert.ToInt32(dateStart.Day);
int stopdd = Convert.ToInt32(stopDate.Day);
int dstopd = Convert.ToInt32(dateStop.Day);
if ((startdm == dstartm && startdd >= dstartd) && (stopdm == dstopm && stopdd <= dstopd))
{
// This one is in interval, so it will be written in data grid view
}
}
В заключение я хочу найти способ заполнить представление таблицы данных теми конкретными данными, которые соответствуют определенному интервалу.
P.S. Я упомянул поле «День», если частота является ежегодной или ежемесячной. В этом случае дата начала равна дате окончания. Если выбранный день для ежемесячной посещаемости не существует в данном месяце, визит не состоится в этом месяце. Пример: если для города ежемесячный день посещаемости составляет 31, посещение этого города не будет в течение месяцев, которые имеют только 30 дней.
РЕДАКТИРОВАТЬ: Хорошо, мне удалось заполнить его данными, где даты находятся в этом интервале, используя:
cmd.CommandText = "SELECT Cities.Name, Planning.StartDate, Planning.StopDate, Planning.Frequency FROM Cities,Planning WHERE Cities.IDCity=Planning.IDCity AND Planning.StartDate>='" + dateTimePicker1.Value.Date + "' AND Planning.StopDate<='" + dateTimePicker2.Value.Date + "'";
Итак, как я могу изменить формат дня, если визит будет ежегодным или ежемесячным? Я имею в виду, если (например) у меня есть: День планирования определенного города (22) и значения сборщиков даты «19/05/2018» (дата начала) и «27/07/2018» (дата окончания) представление сетки данных будет заполнено:
--- Название города - 22/05/2018 - 22/05/2018 - ежемесячно
--- Название города - 22/06/2018 - 22/06/2018 - ежемесячно
--- Название города - 22/07/2018 - 22/07/2018 - ежемесячно