Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Процесс подключения базы данных SQLite к проекту



 

Для подключения базы данных 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():

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() определяет, является ли год високосным, тем самым определяя, сколько дней в феврале. Аналогично для других месяцев.


 


Поделиться:



Популярное:

  1. I. Основные физические явления и процессы в электрических аппаратах
  2. II. Основные электромеханические процессы
  3. II. ПРОЦЕСС ВЫРАБОТКИ: ФОРМИРОВАНИЕ ВЫСШИХ ФОРМ ПОВЕДЕНИЯ БЕЗ ПРИНУЖДЕНИЯ И БОЛИ
  4. IV. Постановления Пленума Верховного Суда РФ и ведомственные нормативные акты в системе регулирования уголовно-процессуальной деятельности
  5. MS Access. Внесение данных в таблицы.
  6. VI. 2. ПРОБЛЕМЫ КУЛЬТУРНОЙ УНИВЕРСАЛИЗАЦИИ В МИРОВОМ СОВРЕМЕННОМ ПРОЦЕССЕ
  7. ІІ. Экономическая адаптация и внутриполитические процессы
  8. А3. Сколько в среднем времени у Вас занимает процесс приготовления основного блюда?
  9. Автоматизация процесса расследования преступлений
  10. Адаптивный иммунитет вырабатывается в процессе жизни индивида и представляет собой специфическую защитную реакцию организма на конкретный чужеродный агент (антиген) с участием лимфоцитов.
  11. Административный процесс: «управленческая» концепция
  12. Административный процесс: «юрисдикционная» концепция


Последнее изменение этой страницы: 2016-07-14; Просмотров: 706; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.186 с.)
Главная | Случайная страница | Обратная связь