Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь 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; просмотров: 289; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.149.243.29 (0.007 с.) |