Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву
Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Процесс подключения базы данных SQLite к проектуСодержание книги
Поиск на нашем сайте
Для подключения базы данных SQLite необходимо в первую очередь выбрать и скачать версию сборки System.Data.SQLite.dll с официального сайта SQLite[]. Добавить в проект скачанный файл как показано на рисунке 6. Затем требуется подключить к файлу пространства имён: using System.Data; using System.Data.SQLite; using System.Data.Common;
Для работы с файлом базы данных используется класс SQLiteConnection, для работы с SQL-запросами используется класс SQLiteCommand, для чтения и обработки результатов SQL-запросов используется класс SQLiteDataReader, или SQLiteDataAdapter с классами DataSet и DataTable.
Рисунок 6 – Добавление ссылки в проект
Была создана функция SetConnection() для работы с файлом базы данных, класс SQLiteConnection() представляет подключение к файлу базы данных SQLite:
private SQLiteConnection con; private void SetConnection(){ con = new SQLiteConnection("Data Source=infSys.db;Version=3;New=False;Compress=True;"); }
Функция ExecuteQuery() была создана для обработки результатов запросов:
private SQLiteCommand cmd; 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():
private void button1_Click(object sender, EventArgs e){ string pass = ""; 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 (Рисунок 8) предназначена для изменения пароля пользователя. Форма имеет три 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 from Klient 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<Weather> ReadFile(string filename){//ф-я чтения List<Weather> res = new List<Weather>(); 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<Weather> CSV_Struct = new List<Weather>(); 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<Weather> Struct = new List<Weather>(); 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() определяет, является ли год високосным, тем самым определяя, сколько дней в феврале. Аналогично для других месяцев.
|
||||
|
Последнее изменение этой страницы: 2016-07-11; просмотров: 419; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.216.41 (0.01 с.) |