Для подключения базы данных SQLite нужно первым делом выбрать и скачать версию сборки System.Data.SQLite.dll с сайта SQLite[14]. Добавить в проект скачанный файл как продемонстрировано на рисунке 6.
После этого требуется подключить к файлу пространства имён:
using System.Data;
using System.Data.SQLite;
using System.Data.Common;
Для работы с файлом базы данных употребляется класс SQLiteConnection, для работы с SQL-запросами употребляется класс SQLiteCommand, для обработки и чтения результатов SQL-запросов употребляется класс SQLiteDataReader, либо SQLiteDataAdapter с классами DataSet и DataTable.
Рисунок 6 – Добавление ссылки в проект
Были созданы функции SetConnection() и ExecuteQuery() для работы с файлом базы данных и обработки результатов запросов, соответственно:
private SQLiteConnection con;
private SQLiteCommand cmd;
private void SetConnection(){
con = new SQLiteConnection(Data Source=infSys.db;Version=3;New=False;Compress=True;);
}
private void ExecuteQuery(string txtQuery){
SetConnection();
con.Open();
cmd = con.CreateCommand();
cmd.CommandText = txtQuery;
cmd.ExecuteNonQuery();
con.Close();
}
Посредством функции ExecuteQuery() упрощается запись данных в файл базы данных.
Описание главных функций
Разглядим главные функции, применяемые для работы с БД.
Разглядим форму Entance (Рисунок 7), предназначенную для входа и выбора пользователя в совокупность. Форма имеет comboBox, что содержит перечень пользователей, textBox для ввода пароля, кнопку «Войти» и кнопку «Поменять пароль».
Рисунок 7 – Форма Entance
Для паролей и хранения пользователей был создан класс UserInfo:
static class UserInfo
{
public static string Admin;
public static string User;
public static string Registrator;
public static string Manager;
public static string passAdm;
public static string passUsr;
public static string passReg;
public static string passMang;
}
Информационная совокупность имеет четыре пользователя, любой из которых владеет собственными правами доступа к данным:
Admin – имеет все права доступа;
User – в праве оформлять и печатать заказ, додавать нового клиента и редактировать данные о нем, рассчитывать цена работы и печатать бланк оплаты, додавать автозапчасти.
Registrator – имеет те же права, что и User плюс добавляется доступ к справочнику, где возможно добавить либо поменять данные о сотрудниках, видах работ и добавить новый Box.
Manager – имеет те же права, что и Registrator плюс имеет доступ к просмотру статистических данных и просмотру всех таблиц.
При нажатии на кнопку «Войти» происходит проверка введенных данных, в случае, если эти совпадают, раскрывается форма MainAutoservice с соответствующими правами. Эти с именами паролей и пользователей сохраняются в отдельной таблице Password. Событие button1_Click():
направляться void button1_Click(object sender, EventArgs e){
SetConnection();
con.Open();
using (SQLiteCommand command = new SQLiteCommand(con)){
//считываем пароль и записываем в переменную
command.CommandText = select pass from Password where Password.Name LIKE ‘ + comboBox1.Text + ‘;
DB = new SQLiteDataAdapter(command.CommandText, con);
SQLiteDataReader DR = command.ExecuteReader();
while (DR.Read()){
pass = DR.GetValue(0).ToString();
}
DR.Close();
}
con.Close();
//определим какой пользователь входит
if (comboBox1.Text == Admin) UserInfo.passAdm = pass;
…
//в случае, если пароли совпадают, то вход
if (comboBox1.Text == UserInfo.Admin textBox1.Text == UserInfo.passAdm){
MainAutoservice fd = new MainAutoservice();
fd.Show();
}
…
else { MessageBox.Show(Неверный логин либо пароль!,Сообщение, MessageBoxButtons.OK, MessageBoxIcon.Information); }
}
При нажатии на кнопку «Поменять пароль» раскрывается форма Password. Событие button2_Click():
private void button2_Click(object sender, EventArgs e){
Password fd = new Password();
fd.ShowDialog();
}
Форма Password (Рисунок предназначена для трансформации пароля пользователя. Форма имеет три textBox, comboBox и кнопку «Поменять пароль». При нажатии на кнопку «Поменять пароль» происходит проверка введенных данных и запись нового пароля в таблицу.
Рисунок 8 – Форма Password
Событие button1_Click():
private void button1_Click(object sender, EventArgs e){
…
//какой пользователь меняет пароль
if (comboBox1.Text == UserInfo.Admin){
//сходится ли ветхий пароль
if (textBox1.Text == UserInfo.passAdm{
if (textBox2.Text == textBox3.Text){
//сохранение нового пароля
UserInfo.passAdm = textBox2.Text;
string txtSQLQuery = UPDATE Password SET pass = ‘ + textBox2.Text + ‘ WHERE Password.Name = ‘Admin’;
ExecuteQuery(txtSQLQuery);
MessageBox.Show(Пароль удачно сменен);
Hide();
}
else MessageBox.Show(Пароли не совпадают);}
else{MessageBox.Show(Ветхий пароль введен неверно!);}
}
…}
Подсказка в textBox (Рисунок 9) имеет следующий код программы:
textBox1.Text = введите ветхий пароль . . .; //подсказка
textBox1.ForeColor = Color.Gray;
Рисунок 9 – Подсказка в textBox
По окончании того как пользователь начинает вводить пароль, текст делается тёмным и заменяется на «*»:
textBox1.Text = null;
textBox1.ForeColor = Color.Black;
textBox1.PasswordChar = ‘*’;
Форма MainAutoservice содержит класс menuStrip, что воображает меню для формы. Класс menuStrip складывается из следующих параметров: Меню (Рисунок 10.1), Таблицы (Рисунок 10.2) и Информационная панель (Рисунок 10.3), каковые со своей стороны имеют собственные параметры.
Рисунок 10.1 – Параметр Меню menuStrip
Рисунок 10.2 – Параметр таблицы menuStrip
Рисунок 10.3 – Параметр Информационная панель menuStrip
Любой параметр имеет клавиши стремительного доступа, каковые возможно установить в особенностях параметра.
Форма содержит класс statusStrip и класс tabControl, что руководит связным комплектом страниц вкладок, складывающийся из трех вкладок: «Оформление заказа», «Клиент» и «Автозапчасти».
На вкладке «Оформление заказа» (Рисунок 11) осуществляется оформление заказа, которое складывается из добавления информации в две таблицы, таблицу Orders и таблицу Repairs.
Рисунок 11 – Вкладка Оформление заказа
Добавление происходит из textBox, comboBox и dataTimePicker.
Любой comboBox заполняется соответствующими элементами. Добавления элементов в comboBox на примере id_klient:
…
using (SQLiteCommand command = new SQLiteCommand(con)){
command.CommandText = @select * from Klient;
DR = command.ExecuteReader();
while (DR.Read()){
comboBox4.Items.Add(DR[id_klient].ToString());
}
}
…
По окончании нажатия на кнопку «Добавить» происходит добавление информации в соответствующие таблицы, функции добавления имеют следующий вид:
private void Add_Orders(){//добавление заказа
string txtSQLQuery = insert into Orders values (NULL,’ + dateTimePicker4.Value.ToString(yyyy-MM-dd) + ‘, ‘ + comboBox4.Text + ‘, ‘+ textBox14.Text + ‘);
ExecuteQuery(txtSQLQuery);
}
private void Add_Repairs(){//добвление ремонтных работ
string txtSQLQuery = insert into Reparies values (NULL,’ + textBox11.Text + ‘, ‘ + dateTimePicker3.Value.ToString(yyyy-MM-dd) + ‘, ‘ + comboBox4.Text +’, ‘ + textBox15.Text + ‘, ‘ + dateTimePicker1.Value.ToString(yyyy-MM-dd) + ‘, ‘ + textBox12.Text + ‘, ‘ + comboBox5.Text + ‘, ‘ + comboBox1.Text + ‘);
ExecuteQuery(txtSQLQuery);
}
Событие button2_Click_1():
private void button2_Click_1(object sender, EventArgs e){
//вызов функций
Add_Orders();
Add_Repairs();
//очистка
textBox14.Text = string.Empty;
comboBox1.Text = string.Empty;
…
//запись следующего номера заказа
int num = dataGridView1.RowCount;
textBox11.Text = num.ToString();
MessageBox.Show(Заказ добавлен!);
…
}
Функция Orders_Load() отображает таблицы Orders и Reparies в dataGridView:
private void Orders_Load(object sender, EventArgs e){
DataSet DS = new DataSet();
DataTable DT = new DataTable();
SetConnection();
con.Open();
using (SQLiteCommand command = new SQLiteCommand(con)){
command.CommandText = @SELECT Orders.id_orders, Orders.[Date], Orders.id_klient, Orders.Notes, Reparies.[Date], Reparies.id_auto, Reparies.id_view_works, Reparies.Term, Reparies.Gaurantee, Reparies.id_box, Reparies.id_master FROM Orders INNER JOIN Reparies ON Orders.id_orders = Reparies.id_orders;;
DB = new SQLiteDataAdapter(command.CommandText, con);
DS.Reset();
DB.Fill(DS);
DT = DS.Tables[0];
dataGridView1.DataSource = DT;
dataGridView1.Columns[0].HeaderText = id_заказа;
dataGridView1.Columns[1].HeaderText = Дата заказа;
…
}
con.Close();
int num = dataGridView1.RowCount;
textBox11.Text = num.ToString();
}
Свойство dataGridView1.RowCount задает «id_заказа», свойство dataGridView1.Columns[].HeaderText задет наименование столбца.
При нажатии на textBox, предназначенный для ввода «id_вида_работы», отображается таблица View_work. Для упрощения ввода, возможно воспользоваться двойным щелчком по ячейке «id_вида_работы», по окончании чего содержание ячейки записывается в textBox.
Событие dataGridView1_CellDoubleClick():
private void dataGridView1_CellDoubleClick(object sender, DataGridViewCellEventArgs e){
if (textBox15.Text == ) textBox15.Text = dataGridView1[0, e.RowIndex].Value.ToString();
else
textBox15.Text += , + dataGridView1[0, e.RowIndex].Value.ToString();
}
Кроме этого вкладка «Оформление заказа» содержит два textBox для поиска информации. Функция поиска на примере поиска клиента по фамилии имеет следующий вид:
…
using (SQLiteCommand command = new SQLiteCommand(con)){
command.CommandText = select * from Klient where FIO LIKE ‘ + textBox1.Text + %’;
DB = new SQLiteDataAdapter(command.CommandText, con);
DS.Reset();
DB.Fill(DS);
DT = DS.Tables[0];
dataGridView7.DataSource = DT;
…
}
При нажатии на кнопку «Печать оформленного заказа», создается и отправляется файл заказа на печать. Событие button5_Click():
private void button5_Click(object sender, EventArgs e){
printDialog1.AllowSomePages = true;
printDialog1.ShowHelp = true;
printDialog1.Document = printDocument1;
DialogResult result = printDialog1.ShowDialog();
string text = ЗАКАЗ № + dataGridView1.CurrentCell.Value;
//задаем имя файла и отправляем на печать
if (result == DialogResult.OK){
printDocument1.DocumentName = text + DateTime.Today;
printDocument1.Print();
}
}
Запись файла происходить следующим образом, по окончании выбора нужного заказа в dataGridView, определяется номер заказа, виды работ и фамилия клиента, поскольку видов работ возможно пара, и поделены они между собой запятой, то логично записать «id работ» в массив. По окончании чего заказ возможно печатать. Событие printDocument1_PrintPage():
private void printDocument1_PrintPage(object sender, PrintPageEventArgs e){
string text = ЗАКАЗ № + dataGridView1.CurrentCell.Value;\\номер заказа
…
//определение фамилии
using (SQLiteCommand command = new SQLiteCommand(con)){
command.CommandText = @select FIO не меньше WHERE id_klient = ‘ + dataGridView1.Rows[activStr].Cells[2].Value.ToString() + ‘;
DR = command.ExecuteReader();
while (DR.Read())
{FIO = DR[FIO].ToString();}
}
using (SQLiteCommand command = new SQLiteCommand(con)){//виды работ
for (int i = 0; i Vw.Length; i++){
if (Vw[i] != ){
command.CommandText = @select View_work.View from View_work where id_view = ‘ + Vw[i] + ‘;
DR = command.ExecuteReader();
while (DR.Read()){
if (View_work == ) View_work = (i+1).ToString()+) + DR[View].ToString() + ; ;
else View_work += (i + 1).ToString() + ) +DR[View].ToString() + ; ;
}
…
//размер области отображения текста
int w = (int)e.Graphics.MeasureString(text + От + dataGridView1.Rows[activStr].Cells[1].Value, BoldFont).Width;
int h = (int)e.Graphics.MeasureString(text + От + dataGridView1.Rows[activStr].Cells[1].Value, BoldFont).Height;
//координаты верхнего левого угла
int x = (this.ClientSize.Width-w)/6;
int y = (this.ClientSize.Height-h)/6;
//заполнение документа
e.Graphics.DrawString(text + От + dataGridView1.Rows[activStr].Cells[1].Value.ToString().Substring(0, 10), BoldFont, System.Drawing.Brushes.Black, x + w /2, y,StringFormat.GenericTypographic);
…
Кроме этого вкладка «Оформление заказа» содержит две кнопки «Справочник» и «Стоимость», при нажатии на каковые раскрываются новые соответствующие формы Prices и Directory.
Во вкладке «Клиент» (Рисунок 12) осуществляется добавление информации из textBox о клиенте и его автомобиле в соответствующие таблицы Klient и Auto. Кроме этого вкладка содержит textBox для поиска клиента по фамилии, dataGridView для отображения таблиц и две кнопки: «Добавить», при нажатии на которую происходит добавление информации в таблицы; «Поменять данные о клиенте», при нажатии раскрывается форма EditKlient.
отображения таблиц и Функции добавления в dataGridView подобны рассмотренным выше.
Рисунок 12 – Вкладка Клиент
На форме EditKlient (Рисунок 13) осуществляется редактирование информации о клиенте и его автомобиле. Форма содержит textBox для поиска клиента по фамилии, две dataGridView для отображения информации из таблиц Klient и Auto. Кроме этого на форме имеется две кнопки для сохранения трансформаций и для отображения таблицы.
Рисунок 13 – Форма EditKlient
Функция отображения таблицы Машин подобна рассмотренной ранее функции, запрос для отображения таблицы имеет следующий вид:
…
//запрос данных, где id_клиента равняется активной строке в dataGridView
command.CommandText = @SELECT Auto.id_auto, Auto.id_klient, Auto.Name_auto, Auto.UIN, Auto.Year, Auto.State_number, Auto.Volume, Auto.Colour FROM Auto WHERE Auto.id_klient = ‘ + dataGridView1.CurrentCell.Value + ‘;;
…
Столбцы, которые содержат данные, которую нельзя изменить, доступны лишь для чтения. Функция сохранения трансформаций имеет следующий вид:
…
using (SQLiteCommandBuilder cb = new SQLiteCommandBuilder(DB)){
try{
cb.GetUpdateCommand();
DB.Update(DT);
MessageBox.Show(Сохранено!, Сохранение);
}
catch (Exception exc){
MessageBox.Show(Неточность! + exc.Message, );
}
}
Во вкладке «Автозапчасти» (Рисунок 14) осуществляется добавление информации из textBox и comboBox в таблицу AutoSparePart. Вкладка содержит кнопку «Добавить», по окончании нажатия на которую происходит запись информации в базу данных, и dataGridView для отображения таблицы. отображения и Функции добавления подобны рассмотренным выше.
Форма Prices (Рисунок 15) имеет textBox и comboBox из которых осуществляется добавление информации в таблицу Prices_work, две dataGridView для отображения таблиц цены и автозапчастей, кнопку «Добавить» и кнопку «Печать бланка оплаты».
Рисунок 14 – Вкладка Автозапчасти
Рисунок 15 – Форма Prices
Добавление элементов в comboBox рассматривалось ранее на примере таблицы клиентов. Разглядим похожую функцию на примере таблицы заказов. Функция имеет следующий вид:
private void Load_orders_inCombo(){
…
using (SQLiteCommand command = new SQLiteCommand(con)){
command.CommandText = @select * from Orders where Orders.id_klient LIKE ‘ + comboBox2.Text + ‘;
DR = command.ExecuteReader();
while (DR.Read())
{ comboBox6.Items.Add(DR[id_orders].ToString()); }
}
…
Функция Load_orders_inCombo() додаёт в comboBox лишь те, заказы каковые принадлежат определенному клиенту из comboBox2.Text.
По окончании того как будут выбраны заказ и клиент, отображается таблица автозапчастей, если они имеются у клиента. В textBox, предназначенный для цены работ, записывается сумма всех выполненных работ для данного заказа. Сумма всех работ высчитывается следующим образом, для начала считываются виды работ из данного заказа и записываются в строчок, а после этого в массив:
…
using (SQLiteCommand command = new SQLiteCommand(con))//виды работ{
command.CommandText = @select id_view_works, id_orders from Reparies INNER JOIN Klient ON Klient.id_klient = Reparies.id_auto where Klient.id_klient LIKE ‘ + comboBox2.Text + @’ AND Reparies.id_orders LIKE ‘ + comboBox6.Text + @’GROUP BY Reparies.id_view_works;
DR = command.ExecuteReader();
while (DR.Read()){
if (str == ) str = DR[id_view_works].ToString();
else str += , + DR[id_view_works].ToString();
}}con.Close();
string[] str1 = str.Split(‘,’);// все виды работ клиента
После этого по таблице View_work осуществляется поиск по виду работы и записывается цена в строчок, а после этого в массив:
…
using (SQLiteCommand command = new SQLiteCommand(con)){
for (int i = 0; i str1.Length; i++){
if (str1[i] != ){
command.CommandText = @SELECT View_work.id_view, View_work.prices_work FROM View_work where View_work.id_view LIKE ‘ + str1[i] + ‘;
DR = command.ExecuteReader();
…
Затем в textBox записывается сумма выполненных работ:
…
int[] p = new int[view.Length — 1];
int Sum = 0;
for (int i = 0; i view.Length — 1; i++){
p[i] = Convert.ToInt32(prices[i], 10);
Sum += p[i];
}
textBox24.Text = Sum.ToString();
…
В textBox, предназначенный для цены автозапчастей, машинально записывается сумма всех имеющихся автозапчастей у клиента, но в случае, если нужно выбрать определенные, то возможно воспользоваться двойным щелчком по нужной ячейке в dataGridView, тогда отобразится сумма выбранных элементов:
private void dataGridView6_CellDoubleClick(object sender, DataGridViewCellEventArgs e){
if (str == ){
str = dataGridView6[2, e.RowIndex].Value.ToString();
textBox25.Text = str;
}else{
str += ; + dataGridView6[2, e.RowIndex].Value.ToString();
int Summa = 0;
string[] sum = str.Split(‘;’);
for (int i = 0; i sum.Length; i++){
Summa += Convert.ToInt32(sum[i], 10);
}
textBox25.Text = Summa.ToString();
}
Форма Directory содержит класс tabControl, складывающийся из трех вкладок: «Добавить сотрудника» (Рисунок 16), «Добавить вид работы» (Рисунок 17) и «Добавить Box». Первые две вкладки складываются из textBox, dataGridView, и трех кнопок: «Добавить», «Редактировать» и «Сохранить трансформации». Вкладка «Добавить Box» (Рисунок 18) имеет лишь кнопку Добавить и dataGridView для отображения таблицы.
Функции добавления, редактирования информации и отображения таблиц подобны функциям рассмотренным ранее.
Форма NowOrders (Рисунок 19) содержит лишь dataGridView для отображения таблицы заказов.
Рисунок 16 – Вкладка Добавить сотрудника
Рисунок 17 – Вкладка Добавить вид работы
Рисунок 18 – Вкладка Добавить Box
Рисунок 19 – Форма NowOrders
Функция отображения активных заказов имеет следующий вид:
private void ActivOrders(){
…
using (SQLiteCommand command = new SQLiteCommand(con)){
command.CommandText = @ SELECT Orders.id_orders, Reparies.id_reparies, Orders.[Date], Orders.Notes, Auto.Name_auto, Auto.State_number, Reparies.id_view_works, Reparies.id_box, Master.FIO FROM Reparies INNER JOIN Orders ON Reparies.id_orders = Orders.id_orders INNER JOIN Auto ON Reparies.id_auto = Auto.id_auto INNER JOIN Master ON Reparies.id_master = Master.id_master WHERE date(‘now’) BETWEEN Orders.[Date] AND Reparies.Term GROUP BY Orders.id_orders;
…
}
con.Close();
label4.Text = (dataGridView2.Rows.Count — 1).ToString();}
Форма AllTables (Рисунок 20) имеет класс tabControl, складывающийся из вкладок, количество которых равняется количеству таблиц в базе данных. Любая вкладка включает в себя лишь dataGridView для отображения соответствующей таблицы.
Рисунок 20 – Форма AllTables
Форма Grafics содержит класс tabControl, складывающийся из трех вкладок: «Графики заказов» (Рисунок 21), «Графики доходов» (Рисунок 22) и «Архив погоды». Первые две вкладки содержат radioButton для определения чёрта отображения графика и компонент chart, предназначенный для отображения графика.
Рисунок 21 – Вкладка Графики заказов
Рисунок 22 – Вкладка Графики доходов
Функция отображения гистограммы заказов за чемь дней:
private void Load_orders_chart_on_week(){//количество заказов за чемь дней
…
using (SQLiteCommand command = new SQLiteCommand(con)){//считываем даты заказов
command.CommandText = @ SELECT Orders.id_orders, Orders.[Date] FROM Orders WHERE Orders.[Date] BETWEEN date(‘now’,’-7 day’) AND date(‘now’);
DR = command.ExecuteReader();
while (DR.Read()){
od += DR[Date].ToString() + ;;
}
…
string[] ordDat = od.Split(‘;’);//date
DateTime thisDay = DateTime.Today;
int[] mas = new int[7];
…
//записываем кол-во заказов в определенный сутки
for (int i = 0; i 7; i++){
for (int j = 0; j ordDat.Length — 1; j++){
if (ordDat[j] == (thisDay.AddDays(-7 + i)).ToString()){
mas[i] += 1;
}
}
chart1.Series[0].Points.AddXY((thisDay.AddDays(-7 + i)).ToString().Substring(0, 5), mas[i]);
}…
Подобно отображаются гистограммы заказов за месяц, гистограммы и год доходов за чемь дней, год и месяц.
Вкладка «Архив погоды» (Рисунок 23) имеет dataGridView для отображения таблицы, listBox для отображения информации о погоде, comboBox, содержащий перечень черт по которым отображается график в компоненте chart, и две кнопки: «Открыть файл и запустить» и «Продемонстрировать».
Рисунок 23 – Вкладка Архив погоды
Кнопка «Открыть файл и запустить», предназначенная для открытия файла архива погоды [10]. Для файла архива погоды была создана структура Weather.
public class Weather{
public string Date { get; set; }
public string W1{ get; set; }
…
public void Read(string line){
string[] parts = line.Split(‘;’); //Разделитель в CVS файле.
Date = parts[0];
…
W1 = parts[12];
…}
public static List ReadFile(string filename){//ф-я чтения
List res = new List();
using (StreamReader sr = new StreamReader(filename)){
string line;
while ((line = sr.ReadLine()) != null){
Weather p = new Weather();
p.Read(line);
res.Add(p);
}
…
Файл архива погоды раскрывается при помощи класса OpenFileDialog и записывается в структуру следующим образом:
List CSV_Struct = new List();
OpenFileDialog openFileDialog1 = new OpenFileDialog();
…
if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK){
var reader = new StreamReader(File.OpenRead(openFileDialog1.FileName));
CSV_Struct = Weather.ReadFile(openFileDialog1.FileName);
fname = openFileDialog1.FileName;
}
По окончании записи отображается в dataGridView, но так как в архиве погоды имеется пара однообразных дат с различным временем, то перед отображением повторяющиеся даты были удалены:
int q=1;
while(q CSV_Struct.Count — 1){
if (CSV_Struct[q].Date.Substring(0, 10) == CSV_Struct[q + 1].Date.Substring(0, 10)) q++;
else { dataGridView2.Rows.Add(CSV_Struct[q].Date.Substring(0, 10)); q++; }
if (q == CSV_Struct.Count-1) dataGridView2.Rows.Add(CSV_Struct[q].Date.Substring(0, 10));
}
for (int i = 0; i dataGridView2.Rows.Count — 1; i++){
for (int j = 0; j dataGridView3.Rows.Count — 1; j++){
if (dataGridView2.Rows[i].Cells[0].Value.ToString() == dataGridView3.Rows[j].Cells[0].Value.ToString().Substring(0, 10)){ k++; }
}
dataGridView2.Rows[i].Cells[1].Value = k;
k = 0;
}
Информация о погоде в определенный сутки записывается в listBox, по окончании выбора в dataGridView нужного дня:
private void dataGridView2_Click(object sender, EventArgs e){
listView1.Items.Clear();
List Struct = new List();
Struct = Weather.ReadFile(fname);
string activStr = dataGridView2.CurrentCell.Value.ToString();
int j = 0;
for (int i = 0; i Struct.Count — 1; i++){
if (Struct[i].Date.Substring(0, 10) == activStr){
listView1.Items.Add(Struct[i].Date);
listView1.Items[j].SubItems.Add(Struct[i].W1);
j++;
}
}
}
В chart отображается количество заказов, выбранного из comboBox месяца. Разглядим на примере февраля:
if (comboBox1.Text == Февраль){
int y = DateTime.Today.Year;
var year = DateTime.IsLeapYear(y);
if (year == true) Array.Resize(ref days28, 29);
chart3.ChartAreas[0].AxisX.Maximum = days28.Length;//большой х
for (int i = 0; i days28.Length; i++){
for (int j = 0; j dataGridView2.Rows.Count — 1; j++){
if (dataGridView2.Rows[j].Cells[0].Value.ToString().Substring(3, 2) == 02){
if (i 10) {
if (dataGridView2.Rows[j].Cells[0].Value.ToString().Substring(0, 2) == 0 + (i + 1).ToString()){
days28[i] += Convert.ToInt16(dataGridView2.Rows[j].Cells[1].Value);
}
}
else{if (dataGridView2.Rows[j].Cells[0].Value.ToString().Substring(0, 2) == (i + 1).ToString()){
days28[i] += Convert.ToInt16(dataGridView2.Rows[j].Cells[1].Value);
…
chart3.Series[0].Points.AddXY(i+1, days28[i]);}
Способ DateTime.IsLeapYear() определяет, есть ли год високосным, тем самым определяя, сколько дней в феврале. Подобно для других месяцев.