Базы данных для карманного персонального компьютера

Добавление-удаление записей

Разбить на страницы
Показывать лекцию целиком

Задача темы: изучить методику и получить навыки в разработке приложений для манипулирования записями в базах данных формата XML.

Разработка: Приложение "CARD VISA" для просмотра, добавления, редактирования, удаления записей и математической обработки данных движения средств на пластиковой карточке.

Состав выполняемых функций:

  • Файловые операции: открыть, сохранить, сохранить как, закрыть
  • Алгоритмы: просмотр и прокрутка записей базы в текстовых полях, таблицах; просмотр отдельной записи; фильтрация и группмировка записей, подсчет сумм расходов по операциям и остатка средств на карточке
  • Информационно-справочные: О программе
  • Наращивание функциональности не предусматривается.

    Защита данных – от неквалифицированных действий пользователя.

    В качестве входных данных используются файлы в формате XML. Выходные данные программы – графическое отображение результатов в виде текстовых полей и таблиц для SmartDevice; файлы в формате XML

    Шаг 1. Разработка графического интерфейса

    Для разработке используется одна форма со свойством ComboBox=False, tabControl с двумя закладками "База данных" и "Редактор".

    На закладке "База данных" размещены надпись "Остаток" с текстовым полем (свойство RaedOnly=True ), кнопка поиска "Найти" и таличный элемент DataGrid.

    На закладке "Редактор" размещены надписи "Сумма", "Цель", "Фирма", "Дата" с соответствующими полями (для поля даты свойство ReadOnly=True ); поле для вывода значения идентификационного номера записи со свойством ReadOnly=True; заголовочная надпись "День-Месяц-Год" с тремя комбобоксами (коллекции комбобоксов: день – от 01 до 31; месяц – от 01 до 12; год - на 10 лет вперед, например, от 07 до 17); кнопки "Фильтр ЦЕЛЬ", "Фильтр ФИРМА", "Показать все", "Добавить", "Удалить", "Заменить".

    Примерный дизайн показан на рис. 10.1 и 10.2

    (рис 10.2) (рис 10.1)

    Невидимые элементы управления: mainMenu с опциями "Открыть", "Сохранить как" и "Выход"; openFileDialog и saveFileDialog. - для диалогов свойство Filter =Документы XML|*.xml

    Шаг 2. Добавляем библиотеки

    using System;
    using System.Drawing;
    using System.Collections;
    using System.Windows.Forms;
    using System.Data;
    // 
    using System.IO;
    using System.Xml;

    Шаг 3. Добавляем переменные в public class Form1 : System.Windows.Forms.Form

    // объявляем переменную имени файла
    string file_name;
    // глобальный датасет
    DataSet dataSet,dataSet1;
    //глобальный дататейбл
    DataTable dataTable, dataTable1;
    int my_grid=0;// статус грида, если 0, то грузим редактор, 
    если 1, то - фильтр string my_fuel, my_service;
    // переменные запроса с группировкой
    // переменные полей 
    string my_summa,my_cell, my_firma,my_ID;
    // переменная номера строки
    System.Int64 my_Int64;   
    //переменная для удаления строки, чтобы не нарушать коллекцию foreach
    DataRow remove_row;
    DataRow newRow;
    Int64 my_maxID=0;
    // установка начального значения текущей даты
    string my_day="01";
    string my_mon="01";
    string my_yea="01";
    // фильтр
    string my_filt, my_chan;

    Шаг 4. Дополняем public Form1()

    {
    InitializeComponent();
    file_name="dataSet.xml"; // тестовый файл загрузки по умолчанию
    file_read(); // вызов функции чтения данных из файла
    // устанавливаем системную дату для облегчения ввода дат пользователем 
    DateTime curDate = new DateTime();
    curDate=DateTime.Now;
    my_day=curDate.ToString("dd.MM.yyyy").Substring(0,2);
    my_mon=curDate.ToString("dd.MM.yyyy").Substring(3,2);
    my_yea=curDate.ToString("dd.MM.yyyy").Substring(8,2);
    // грузим дату в комбобоксы
    this.comboBox1.Text=my_day;
    this.comboBox2.Text=my_mon;
    this.comboBox3.Text=my_yea;
    }

    Шаг 5. Создаем функцию file_read()

    Фунция открывает файл для чтения и грузит данные в Датагрид, затем рекурсивно вызывает функцию подсчета остатка средств на карточке

    private void file_read() {
    FileStream fin;		
    try {
    fin=new FileStream(file_name,FileMode.Open);
    fin.Close();
    	}
    catch(IOException exc) {
    MessageBox.Show ("Невозможно открыть файл \n"+file_name,"Ошибка");
    return;}
    // Считываем значения из файла
    XmlTextReader xml_in=new XmlTextReader(file_name); 
    dataSet=new DataSet();
    dataTable=dataSet.Tables.Add("CardVISA");
    // добавляем столбцы
    dataTable.Columns.Add("Сумма",System.Type.GetType("System.String"));
    dataTable.Columns.Add("Цель",System.Type.GetType("System.String"));
    dataTable.Columns.Add("Фирма",System.Type.GetType("System.String"));
    dataTable.Columns.Add("Дата",System.Type.GetType("System.String"));
    dataTable.Columns.Add("ID",System.Type.GetType("System.Int64"));
    dataSet.ReadXml(@xml_in);
    xml_in.Close(); // закрываем входящий поток
    // сначала сортируем строки по столбцу ID
    DataView sortedView=new DataView(dataTable);
    // обратная сортировка	
    sortedView.Sort="ID DESC";
    // привязываем
    dataGrid1.DataSource=sortedView;
    balance(); // вызываем функцию пересчета остатка
    }

    Шаг 6. Создаем функцию подсчета остатка средств на карточке balance()

    private void balance() {
    float my_balance=0;
    foreach (DataRow row in dataTable.Rows) {// цикл построчного пересчета
    my_summa=(row["Сумма"].ToString());
    my_balance=my_balance+float.Parse(my_summa); // нарастающий итог
    }
    textBox6.Text=my_balance.ToString(); // показываем результат
    }

    Шаг 7. Создаем процедуру открытия файла

    Если файл DataSet.xml отсутствует или ведет расчеты по другой карточке для опции главного меню "Открыть" пишем:

    // читаем файл
    private void menuItem2_Click(object sender, System.EventArgs e) { 
    if (openFileDialog1.ShowDialog()==DialogResult.OK) {
    file_name=openFileDialog1.FileName;
    	file_read();
    	}
    }

    Шаг 8. Создаем процедуру сохранения файла

    Для опции главного меню "Сохранить как" пишем:

    private void menuItem3_Click(object sender, System.EventArgs e) {
    saveFileDialog1.FileName=file_name;
    if (saveFileDialog1.ShowDialog()==DialogResult.OK) {
    	file_name=saveFileDialog1.FileName;
    	FileStream fin_out;		
    	try {
    	fin_out=new FileStream(file_name,FileMode.OpenOrCreate);
    	fin_out.Close();
    		}
    	catch(IOException exc) {
    	MessageBox.Show ("Невозможно открыть файл.","Ошибка");
    	return;}
    	StreamWriter xml_out;
    	try {
    	xml_out=new StreamWriter(file_name);
    		}
    	catch(IOException exc) {
    	MessageBox.Show ("Невозможно открыть файл.","Ошибка");
    	return;}
    // форматируем xml
    	XmlTextWriter xmlWriter=new XmlTextWriter(xml_out);
    	xmlWriter.Formatting=Formatting.Indented;
    	xmlWriter.Indentation=3; 
    // принимаем изменения в dataSet !!!
    	this.dataTable.AcceptChanges();
    // выводим в xml
    	dataSet.WriteXml(xmlWriter,XmlWriteMode.IgnoreSchema);
    	xmlWriter.Close();
    	MessageBox.Show("Файл записан в формате XML","Сохранение");
    	}
    }

    Шаг 9. Выходим из программы

    Для опции главного меню "Выход" пишем:

    private void menuItem4_Click(object sender, System.EventArgs e) {
    Application.Exit(); // что не очень хорошо, если изменения еще не записаны
    }

    Шаг 10. Создаем функцию считывания данных из полей закладки "Редактор"

    private void appe_row() {
    // заполняем текстбох даты
    my_day=this.comboBox1.Text;
    my_mon=this.comboBox2.Text;
    my_yea=this.comboBox3.Text;
    this.textBox4.Text=my_day+"-"+my_mon+"-"+my_yea;
    // вычисляем длину строки
    int my_len=textBox1.Text.Length;
    if (my_len>=2) {
     // проверяем минус, если вводится отрицательное число
    	if (textBox1.Text.Substring(0,1)=="-") {
    	// проверяем вторую цифру
    		if (!char.IsDigit(textBox1.Text[1])) {
    		MessageBox.Show("Введите отрицательную сумму!","Ошибка");
    		return;}
    		}
    	else
    	// проверяем первую
    	if (!char.IsDigit(textBox1.Text[0])) {
    	MessageBox.Show("Введите сумму!","Ошибка");
    	return;}
    	// если длина больше 2-х
    	else
    	if (!char.IsDigit(textBox1.Text[0])) {
    	MessageBox.Show("Введите сумму!","Ошибка");
    	return;}
    	}
    }

    Шаг 11. Создаем процедуру добавления записи в базу

    Для кнопки "Добавить" закладки "Редактор" пишем:

    private void button1_Click(object sender, System.EventArgs e) {
    appe_row(); // считываем значение полей закладки "Редактор"
    // вычисляем последнее значения
    foreach (DataRow row2 in dataTable.Rows) {
    string my_IDD=(row2["ID"].ToString());
    my_Int64=Int64.Parse(my_IDD);
    if (my_maxID<=my_Int64) {
    my_maxID=my_Int64+1;
    }
    }
    this.textBox5.Text=my_maxID.ToString();
    my_maxID=0; // обнуляем максимальный номер и вводим данные	
    newRow=dataTable.NewRow();
    newRow["Сумма"]=this.textBox1.Text;
    newRow["Цель"]=this.textBox2.Text;
    newRow["Фирма"]=this.textBox3.Text;
    newRow["Дата"]=this.textBox4.Text;	 
    newRow["ID"]=this.textBox5.Text;
    // добавляем запись
    dataTable.Rows.Add(newRow);
    this.tabControl1.SelectedIndex=0; // переключаемя за закладку "База данных"
    balance(); // считаем остаток на карточке
    }

    Шаг 12. Создаем процедуру удаления записи

    Для кнопки "Удалить" закладка "Редактор" пишем:

    private void button2_Click(object sender, System.EventArgs e) {
    if (this.textBox5.Text = = "0") {// если идентификационный номер строки 0
     MessageBox.Show("Строка уже удалена","Ошибка");
    return;}
    string remove_ID=textBox5.Text;
    foreach (DataRow row in dataTable.Rows) {
    my_ID=(row["ID"].ToString());		
    if (my_ID = = remove_ID) {
    	remove_row=row;
    		}
    	}
    dataTable.Rows.Remove(remove_row);
    // обнуляем номер строки, чтобы избежать исключения о ненайденной строке
    this.textBox5.Text="0"; 
    this.tabControl1.SelectedIndex=0;
    balance(); // пересчитываем остаток
    }

    Шаг 13. Создаем процедуру замены записи при редактировании данных

    Для кнопки "Заменить" закладки "Редактор" пишем:

    private void button3_Click(object sender, System.EventArgs e) {
    // сначала удаляем строку
    if (this.textBox5.Text=="0") {
    MessageBox.Show("Строка уже удалена","Ошибка");
    return;}
    string remove_ID=textBox5.Text;
    foreach (DataRow row in dataTable.Rows) {
    	my_ID=(row["ID"].ToString());		
    	if (my_ID==remove_ID) {
    		remove_row=row;				
    		}
    	}
    dataTable.Rows.Remove(remove_row);
    // считываем значения
    appe_row();
    // вводим данные	
    newRow=dataTable.NewRow();
    newRow["Сумма"]=this.textBox1.Text;
    newRow["Цель"]=this.textBox2.Text;
    newRow["Фирма"]=this.textBox3.Text;
    newRow["Дата"]=this.textBox4.Text;	 
    // переписываем номер
    newRow["ID"]=remove_ID;
    // добавляем запись
    dataTable.Rows.Add(newRow);
    // обнуляем номер строки, чтобы избежать исключения о ненайденной строке
    this.textBox5.Text="0"; 
    this.tabControl1.SelectedIndex=0;
    balance();
    }

    Шаг 14. Создаем функцию фильтра целевых расходов

    private void cell_sum() {
    float my_balance=0;
    foreach (DataRow row in dataTable.Rows) {
    my_summa=(row["Сумма"].ToString());
    my_cell=(row[my_chan].ToString());
    if (my_filt==my_cell) {
    	 my_balance=my_balance+float.Parse(my_summa);
    }
    	}
    textBox6.Text=my_balance.ToString();
    }

    Шаг 15. Создаем процедуру фильтрации целевых расходов

    Для кнопки "Фильтр цели" пишем:

    private void button4_Click(object sender, System.EventArgs e) {
    // внимательно: в кавычки берется апостроф
    dataTable.DefaultView.RowFilter="Цель='"+this.textBox2.Text+"'";
    dataGrid1.DataSource=dataTable;
    this.tabControl1.SelectedIndex=0;
    my_filt=this.textBox2.Text;
    my_chan="Цель";
    cell_sum(); // считаем результат
    }

    Шаг 16. Создаем процедуру фильтрации расходов по фирмам

    Для кнопки "Фильтр фирмы" пишем:

    private void button6_Click(object sender, System.EventArgs e) {
    dataTable.DefaultView.RowFilter="Фирма='"+this.textBox3.Text+"'";
    dataGrid1.DataSource=dataTable;
    this.tabControl1.SelectedIndex=0;
    my_filt=this.textBox3.Text;
    my_chan="Фирма";
    cell_sum();
    }

    Шаг 17. Создаем процедуру удаления фильтра

    Для кнопки "Показать все" пишем:

    private void button5_Click(object sender, System.EventArgs e) {
    DataView sortedView=new DataView(dataTable);
    // обратная сортировка	
    sortedView.Sort="ID DESC";
    dataGrid1.DataSource=sortedView;
    this.tabControl1.SelectedIndex=0; 
    balance();
    }

    Шаг 18. Создаем процедуру запроса с группировкой данных

    Для кнопки "Найти" закладки "База данных" пишем:

    private void My_Query(){
    // выборка целей платежей -  создаем структуру таблицы DataSet1 
    dataSet1=new DataSet();
    dataTable1=dataSet1.Tables.Add("Платежи");
    // добавляем столбцы
    dataTable1.Columns.Add("Цель",System.Type.GetType("System.String"));
    dataTable1.Columns.Add("Сумма",System.Type.GetType("System.String"));
    // добавляем первую строку для шаблона
    int my_test=0;
    string my_sum;
    float my_summa=0;
    foreach (DataRow row in dataTable.Rows) { // перебираем все записи
    my_fuel=(row["Цель"].ToString());
    my_test=0;
    DataRow[] rowCell=dataTable.Select("Цель='"+my_fuel+"'");
    // вложенные циклы выборки записей по условию
    	foreach (DataRow rowTable in rowCell) {
    	my_summa=my_summa+float.Parse(rowTable["Сумма"].ToString());
    	}
    	foreach (DataRow row1 in dataTable1.Rows){
    	my_service=(row1["Цель"].ToString());
    		if (my_fuel==my_service)
    		my_test=1;
    	}
    if (my_test==0){
    	my_sum=my_summa.ToString();
    	object[] a1={my_fuel,my_sum};
    	dataTable1.Rows.Add(a1);
    		}
    my_summa=0;
    }
    //привязываем
    dataGrid1.TableStyles.Clear();
    // стиль грид делаем программно
    DataGridTableStyle ts= new DataGridTableStyle();
    ts.MappingName="Платежи";
    DataGridTextBoxColumn cs=new DataGridTextBoxColumn();// первый столбец
    cs.Width=120;
    cs.MappingName="Цель";
    cs.HeaderText="Выберите платеж";
    cs.NullText="";
    ts.GridColumnStyles.Add(cs);
    cs = new DataGridTextBoxColumn();// второй столбец
    cs.Width=70;
    cs.MappingName="Сумма";
    cs.HeaderText="ИТОГО";
    ts.GridColumnStyles.Add(cs);
    this.dataGrid1.TableStyles.Add(ts);
    DataView sortedView1=new DataView(dataTable1);
    sortedView1.Sort="Цель";
    dataGrid1.DataSource=sortedView1;
    my_grid=1;	
    }

    Шаг 19. Создаем процедуру для кнопки "Найти"

    private void button7_Click(object sender, System.EventArgs e) {
    if (this.dataGrid1.Visible==false) {// выводим сообщение с картинкой
    MessageBox.Show("Откройте или создайте файл данных!", 
    "Ошибка", MessageBoxButtons.OK,
    MessageBoxIcon.Asterisk,MessageBoxDefaultButton.Button1 );
    	return;}
    My_Query();
    }

    Шаг 20. Создаем процедуру выборки данных из базы по условию

    Для клика записи ДатаГрид пишем:

    private void dataGrid1_Click(object sender, System.EventArgs e) {
    // номер "кликнутой" строки
    int N_row=dataGrid1.CurrentCell.RowNumber;
    // номер сторбца
    int N_col=dataGrid1.CurrentCell.ColumnNumber;
    if (my_grid==1) {
    my_fuel=dataGrid1[N_row,0].ToString();
    DataView sortedView=new DataView(dataTable);
    sortedView.Sort="ID DESC";
    sortedView.RowFilter="Цель='"+my_fuel+"'";
    dataGrid1.TableStyles.Clear();
    dataGrid1.TableStyles.Add(dataGridTableStyle1);
    dataGrid1.DataSource=sortedView;			
    my_grid=0;
    return;	 
    	}
    // вывод значения ячейки
    my_ID=dataGrid1[N_row,0].ToString()+"\n"+
    dataGrid1[N_row,1].ToString()+"\n"+
    dataGrid1[N_row,2].ToString()+"\n"+
    dataGrid1[N_row,3].ToString()+"\n"+
    	dataGrid1[N_row,4].ToString();
    textBox1.Text=dataGrid1[N_row,0].ToString();
    textBox2.Text=dataGrid1[N_row,1].ToString();
    textBox3.Text=dataGrid1[N_row,2].ToString();
    textBox4.Text=dataGrid1[N_row,3].ToString();
    textBox5.Text=dataGrid1[N_row,4].ToString();
    string mes=N_col.ToString();;
    if (N_col==0) {mes="Сумма";}
    	if (N_col==1) {mes="Цель";}
    		if (N_col==2) {mes="Фирма";}
    			if (N_col==3) {mes="Дата";}
    				if (N_col==4) {mes="ID";}
    if (MessageBox.Show(my_ID+"\n Редактировать?",mes, 
    MessageBoxButtons.YesNo, 
    MessageBoxIcon.Question,MessageBoxDefaultButton.Button2) = 
    = DialogResult.Yes)
    	this.tabControl1.SelectedIndex=1;
    }
    Страницы:

    Задача темы: изучить методику и получить навыки в разработке приложений для манипулирования записями в базах данных формата XML.

    Разработка: Приложение "CARD VISA" для просмотра, добавления, редактирования, удаления записей и математической обработки данных движения средств на пластиковой карточке.

    Состав выполняемых функций:

  • Файловые операции: открыть, сохранить, сохранить как, закрыть
  • Алгоритмы: просмотр и прокрутка записей базы в текстовых полях, таблицах; просмотр отдельной записи; фильтрация и группмировка записей, подсчет сумм расходов по операциям и остатка средств на карточке
  • Информационно-справочные: О программе
  • Наращивание функциональности не предусматривается.

    Защита данных – от неквалифицированных действий пользователя.

    В качестве входных данных используются файлы в формате XML. Выходные данные программы – графическое отображение результатов в виде текстовых полей и таблиц для SmartDevice; файлы в формате XML

    Шаг 1. Разработка графического интерфейса

    Для разработке используется одна форма со свойством ComboBox=False, tabControl с двумя закладками "База данных" и "Редактор".

    На закладке "База данных" размещены надпись "Остаток" с текстовым полем (свойство RaedOnly=True ), кнопка поиска "Найти" и таличный элемент DataGrid.

    На закладке "Редактор" размещены надписи "Сумма", "Цель", "Фирма", "Дата" с соответствующими полями (для поля даты свойство ReadOnly=True ); поле для вывода значения идентификационного номера записи со свойством ReadOnly=True; заголовочная надпись "День-Месяц-Год" с тремя комбобоксами (коллекции комбобоксов: день – от 01 до 31; месяц – от 01 до 12; год - на 10 лет вперед, например, от 07 до 17); кнопки "Фильтр ЦЕЛЬ", "Фильтр ФИРМА", "Показать все", "Добавить", "Удалить", "Заменить".

    Примерный дизайн показан на рис. 10.1 и 10.2

    (рис 10.2) (рис 10.1)

    Невидимые элементы управления: mainMenu с опциями "Открыть", "Сохранить как" и "Выход"; openFileDialog и saveFileDialog. - для диалогов свойство Filter =Документы XML|*.xml

    Шаг 2. Добавляем библиотеки

    using System;
    using System.Drawing;
    using System.Collections;
    using System.Windows.Forms;
    using System.Data;
    // 
    using System.IO;
    using System.Xml;

    Шаг 3. Добавляем переменные в public class Form1 : System.Windows.Forms.Form

    // объявляем переменную имени файла
    string file_name;
    // глобальный датасет
    DataSet dataSet,dataSet1;
    //глобальный дататейбл
    DataTable dataTable, dataTable1;
    int my_grid=0;// статус грида, если 0, то грузим редактор, 
    если 1, то - фильтр string my_fuel, my_service;
    // переменные запроса с группировкой
    // переменные полей 
    string my_summa,my_cell, my_firma,my_ID;
    // переменная номера строки
    System.Int64 my_Int64;   
    //переменная для удаления строки, чтобы не нарушать коллекцию foreach
    DataRow remove_row;
    DataRow newRow;
    Int64 my_maxID=0;
    // установка начального значения текущей даты
    string my_day="01";
    string my_mon="01";
    string my_yea="01";
    // фильтр
    string my_filt, my_chan;

    Шаг 4. Дополняем public Form1()

    {
    InitializeComponent();
    file_name="dataSet.xml"; // тестовый файл загрузки по умолчанию
    file_read(); // вызов функции чтения данных из файла
    // устанавливаем системную дату для облегчения ввода дат пользователем 
    DateTime curDate = new DateTime();
    curDate=DateTime.Now;
    my_day=curDate.ToString("dd.MM.yyyy").Substring(0,2);
    my_mon=curDate.ToString("dd.MM.yyyy").Substring(3,2);
    my_yea=curDate.ToString("dd.MM.yyyy").Substring(8,2);
    // грузим дату в комбобоксы
    this.comboBox1.Text=my_day;
    this.comboBox2.Text=my_mon;
    this.comboBox3.Text=my_yea;
    }

    Шаг 5. Создаем функцию file_read()

    Фунция открывает файл для чтения и грузит данные в Датагрид, затем рекурсивно вызывает функцию подсчета остатка средств на карточке

    private void file_read() {
    FileStream fin;		
    try {
    fin=new FileStream(file_name,FileMode.Open);
    fin.Close();
    	}
    catch(IOException exc) {
    MessageBox.Show ("Невозможно открыть файл \n"+file_name,"Ошибка");
    return;}
    // Считываем значения из файла
    XmlTextReader xml_in=new XmlTextReader(file_name); 
    dataSet=new DataSet();
    dataTable=dataSet.Tables.Add("CardVISA");
    // добавляем столбцы
    dataTable.Columns.Add("Сумма",System.Type.GetType("System.String"));
    dataTable.Columns.Add("Цель",System.Type.GetType("System.String"));
    dataTable.Columns.Add("Фирма",System.Type.GetType("System.String"));
    dataTable.Columns.Add("Дата",System.Type.GetType("System.String"));
    dataTable.Columns.Add("ID",System.Type.GetType("System.Int64"));
    dataSet.ReadXml(@xml_in);
    xml_in.Close(); // закрываем входящий поток
    // сначала сортируем строки по столбцу ID
    DataView sortedView=new DataView(dataTable);
    // обратная сортировка	
    sortedView.Sort="ID DESC";
    // привязываем
    dataGrid1.DataSource=sortedView;
    balance(); // вызываем функцию пересчета остатка
    }

    Шаг 6. Создаем функцию подсчета остатка средств на карточке balance()

    private void balance() {
    float my_balance=0;
    foreach (DataRow row in dataTable.Rows) {// цикл построчного пересчета
    my_summa=(row["Сумма"].ToString());
    my_balance=my_balance+float.Parse(my_summa); // нарастающий итог
    }
    textBox6.Text=my_balance.ToString(); // показываем результат
    }

    Шаг 7. Создаем процедуру открытия файла

    Если файл DataSet.xml отсутствует или ведет расчеты по другой карточке для опции главного меню "Открыть" пишем:

    // читаем файл
    private void menuItem2_Click(object sender, System.EventArgs e) { 
    if (openFileDialog1.ShowDialog()==DialogResult.OK) {
    file_name=openFileDialog1.FileName;
    	file_read();
    	}
    }

    Шаг 8. Создаем процедуру сохранения файла

    Для опции главного меню "Сохранить как" пишем:

    private void menuItem3_Click(object sender, System.EventArgs e) {
    saveFileDialog1.FileName=file_name;
    if (saveFileDialog1.ShowDialog()==DialogResult.OK) {
    	file_name=saveFileDialog1.FileName;
    	FileStream fin_out;		
    	try {
    	fin_out=new FileStream(file_name,FileMode.OpenOrCreate);
    	fin_out.Close();
    		}
    	catch(IOException exc) {
    	MessageBox.Show ("Невозможно открыть файл.","Ошибка");
    	return;}
    	StreamWriter xml_out;
    	try {
    	xml_out=new StreamWriter(file_name);
    		}
    	catch(IOException exc) {
    	MessageBox.Show ("Невозможно открыть файл.","Ошибка");
    	return;}
    // форматируем xml
    	XmlTextWriter xmlWriter=new XmlTextWriter(xml_out);
    	xmlWriter.Formatting=Formatting.Indented;
    	xmlWriter.Indentation=3; 
    // принимаем изменения в dataSet !!!
    	this.dataTable.AcceptChanges();
    // выводим в xml
    	dataSet.WriteXml(xmlWriter,XmlWriteMode.IgnoreSchema);
    	xmlWriter.Close();
    	MessageBox.Show("Файл записан в формате XML","Сохранение");
    	}
    }

    Шаг 9. Выходим из программы

    Для опции главного меню "Выход" пишем:

    private void menuItem4_Click(object sender, System.EventArgs e) {
    Application.Exit(); // что не очень хорошо, если изменения еще не записаны
    }

    Шаг 10. Создаем функцию считывания данных из полей закладки "Редактор"

    private void appe_row() {
    // заполняем текстбох даты
    my_day=this.comboBox1.Text;
    my_mon=this.comboBox2.Text;
    my_yea=this.comboBox3.Text;
    this.textBox4.Text=my_day+"-"+my_mon+"-"+my_yea;
    // вычисляем длину строки
    int my_len=textBox1.Text.Length;
    if (my_len>=2) {
     // проверяем минус, если вводится отрицательное число
    	if (textBox1.Text.Substring(0,1)=="-") {
    	// проверяем вторую цифру
    		if (!char.IsDigit(textBox1.Text[1])) {
    		MessageBox.Show("Введите отрицательную сумму!","Ошибка");
    		return;}
    		}
    	else
    	// проверяем первую
    	if (!char.IsDigit(textBox1.Text[0])) {
    	MessageBox.Show("Введите сумму!","Ошибка");
    	return;}
    	// если длина больше 2-х
    	else
    	if (!char.IsDigit(textBox1.Text[0])) {
    	MessageBox.Show("Введите сумму!","Ошибка");
    	return;}
    	}
    }

    Шаг 11. Создаем процедуру добавления записи в базу

    Для кнопки "Добавить" закладки "Редактор" пишем:

    private void button1_Click(object sender, System.EventArgs e) {
    appe_row(); // считываем значение полей закладки "Редактор"
    // вычисляем последнее значения
    foreach (DataRow row2 in dataTable.Rows) {
    string my_IDD=(row2["ID"].ToString());
    my_Int64=Int64.Parse(my_IDD);
    if (my_maxID<=my_Int64) {
    my_maxID=my_Int64+1;
    }
    }
    this.textBox5.Text=my_maxID.ToString();
    my_maxID=0; // обнуляем максимальный номер и вводим данные	
    newRow=dataTable.NewRow();
    newRow["Сумма"]=this.textBox1.Text;
    newRow["Цель"]=this.textBox2.Text;
    newRow["Фирма"]=this.textBox3.Text;
    newRow["Дата"]=this.textBox4.Text;	 
    newRow["ID"]=this.textBox5.Text;
    // добавляем запись
    dataTable.Rows.Add(newRow);
    this.tabControl1.SelectedIndex=0; // переключаемя за закладку "База данных"
    balance(); // считаем остаток на карточке
    }

    Шаг 12. Создаем процедуру удаления записи

    Для кнопки "Удалить" закладка "Редактор" пишем:

    private void button2_Click(object sender, System.EventArgs e) {
    if (this.textBox5.Text = = "0") {// если идентификационный номер строки 0
     MessageBox.Show("Строка уже удалена","Ошибка");
    return;}
    string remove_ID=textBox5.Text;
    foreach (DataRow row in dataTable.Rows) {
    my_ID=(row["ID"].ToString());		
    if (my_ID = = remove_ID) {
    	remove_row=row;
    		}
    	}
    dataTable.Rows.Remove(remove_row);
    // обнуляем номер строки, чтобы избежать исключения о ненайденной строке
    this.textBox5.Text="0"; 
    this.tabControl1.SelectedIndex=0;
    balance(); // пересчитываем остаток
    }

    Шаг 13. Создаем процедуру замены записи при редактировании данных

    Для кнопки "Заменить" закладки "Редактор" пишем:

    private void button3_Click(object sender, System.EventArgs e) {
    // сначала удаляем строку
    if (this.textBox5.Text=="0") {
    MessageBox.Show("Строка уже удалена","Ошибка");
    return;}
    string remove_ID=textBox5.Text;
    foreach (DataRow row in dataTable.Rows) {
    	my_ID=(row["ID"].ToString());		
    	if (my_ID==remove_ID) {
    		remove_row=row;				
    		}
    	}
    dataTable.Rows.Remove(remove_row);
    // считываем значения
    appe_row();
    // вводим данные	
    newRow=dataTable.NewRow();
    newRow["Сумма"]=this.textBox1.Text;
    newRow["Цель"]=this.textBox2.Text;
    newRow["Фирма"]=this.textBox3.Text;
    newRow["Дата"]=this.textBox4.Text;	 
    // переписываем номер
    newRow["ID"]=remove_ID;
    // добавляем запись
    dataTable.Rows.Add(newRow);
    // обнуляем номер строки, чтобы избежать исключения о ненайденной строке
    this.textBox5.Text="0"; 
    this.tabControl1.SelectedIndex=0;
    balance();
    }

    Шаг 14. Создаем функцию фильтра целевых расходов

    private void cell_sum() {
    float my_balance=0;
    foreach (DataRow row in dataTable.Rows) {
    my_summa=(row["Сумма"].ToString());
    my_cell=(row[my_chan].ToString());
    if (my_filt==my_cell) {
    	 my_balance=my_balance+float.Parse(my_summa);
    }
    	}
    textBox6.Text=my_balance.ToString();
    }

    Шаг 15. Создаем процедуру фильтрации целевых расходов

    Для кнопки "Фильтр цели" пишем:

    private void button4_Click(object sender, System.EventArgs e) {
    // внимательно: в кавычки берется апостроф
    dataTable.DefaultView.RowFilter="Цель='"+this.textBox2.Text+"'";
    dataGrid1.DataSource=dataTable;
    this.tabControl1.SelectedIndex=0;
    my_filt=this.textBox2.Text;
    my_chan="Цель";
    cell_sum(); // считаем результат
    }

    Шаг 16. Создаем процедуру фильтрации расходов по фирмам

    Для кнопки "Фильтр фирмы" пишем:

    private void button6_Click(object sender, System.EventArgs e) {
    dataTable.DefaultView.RowFilter="Фирма='"+this.textBox3.Text+"'";
    dataGrid1.DataSource=dataTable;
    this.tabControl1.SelectedIndex=0;
    my_filt=this.textBox3.Text;
    my_chan="Фирма";
    cell_sum();
    }

    Шаг 17. Создаем процедуру удаления фильтра

    Для кнопки "Показать все" пишем:

    private void button5_Click(object sender, System.EventArgs e) {
    DataView sortedView=new DataView(dataTable);
    // обратная сортировка	
    sortedView.Sort="ID DESC";
    dataGrid1.DataSource=sortedView;
    this.tabControl1.SelectedIndex=0; 
    balance();
    }

    Шаг 18. Создаем процедуру запроса с группировкой данных

    Для кнопки "Найти" закладки "База данных" пишем:

    private void My_Query(){
    // выборка целей платежей -  создаем структуру таблицы DataSet1 
    dataSet1=new DataSet();
    dataTable1=dataSet1.Tables.Add("Платежи");
    // добавляем столбцы
    dataTable1.Columns.Add("Цель",System.Type.GetType("System.String"));
    dataTable1.Columns.Add("Сумма",System.Type.GetType("System.String"));
    // добавляем первую строку для шаблона
    int my_test=0;
    string my_sum;
    float my_summa=0;
    foreach (DataRow row in dataTable.Rows) { // перебираем все записи
    my_fuel=(row["Цель"].ToString());
    my_test=0;
    DataRow[] rowCell=dataTable.Select("Цель='"+my_fuel+"'");
    // вложенные циклы выборки записей по условию
    	foreach (DataRow rowTable in rowCell) {
    	my_summa=my_summa+float.Parse(rowTable["Сумма"].ToString());
    	}
    	foreach (DataRow row1 in dataTable1.Rows){
    	my_service=(row1["Цель"].ToString());
    		if (my_fuel==my_service)
    		my_test=1;
    	}
    if (my_test==0){
    	my_sum=my_summa.ToString();
    	object[] a1={my_fuel,my_sum};
    	dataTable1.Rows.Add(a1);
    		}
    my_summa=0;
    }
    //привязываем
    dataGrid1.TableStyles.Clear();
    // стиль грид делаем программно
    DataGridTableStyle ts= new DataGridTableStyle();
    ts.MappingName="Платежи";
    DataGridTextBoxColumn cs=new DataGridTextBoxColumn();// первый столбец
    cs.Width=120;
    cs.MappingName="Цель";
    cs.HeaderText="Выберите платеж";
    cs.NullText="";
    ts.GridColumnStyles.Add(cs);
    cs = new DataGridTextBoxColumn();// второй столбец
    cs.Width=70;
    cs.MappingName="Сумма";
    cs.HeaderText="ИТОГО";
    ts.GridColumnStyles.Add(cs);
    this.dataGrid1.TableStyles.Add(ts);
    DataView sortedView1=new DataView(dataTable1);
    sortedView1.Sort="Цель";
    dataGrid1.DataSource=sortedView1;
    my_grid=1;	
    }

    Шаг 19. Создаем процедуру для кнопки "Найти"

    private void button7_Click(object sender, System.EventArgs e) {
    if (this.dataGrid1.Visible==false) {// выводим сообщение с картинкой
    MessageBox.Show("Откройте или создайте файл данных!", 
    "Ошибка", MessageBoxButtons.OK,
    MessageBoxIcon.Asterisk,MessageBoxDefaultButton.Button1 );
    	return;}
    My_Query();
    }

    Шаг 20. Создаем процедуру выборки данных из базы по условию

    Для клика записи ДатаГрид пишем:

    private void dataGrid1_Click(object sender, System.EventArgs e) {
    // номер "кликнутой" строки
    int N_row=dataGrid1.CurrentCell.RowNumber;
    // номер сторбца
    int N_col=dataGrid1.CurrentCell.ColumnNumber;
    if (my_grid==1) {
    my_fuel=dataGrid1[N_row,0].ToString();
    DataView sortedView=new DataView(dataTable);
    sortedView.Sort="ID DESC";
    sortedView.RowFilter="Цель='"+my_fuel+"'";
    dataGrid1.TableStyles.Clear();
    dataGrid1.TableStyles.Add(dataGridTableStyle1);
    dataGrid1.DataSource=sortedView;			
    my_grid=0;
    return;	 
    	}
    // вывод значения ячейки
    my_ID=dataGrid1[N_row,0].ToString()+"\n"+
    dataGrid1[N_row,1].ToString()+"\n"+
    dataGrid1[N_row,2].ToString()+"\n"+
    dataGrid1[N_row,3].ToString()+"\n"+
    	dataGrid1[N_row,4].ToString();
    textBox1.Text=dataGrid1[N_row,0].ToString();
    textBox2.Text=dataGrid1[N_row,1].ToString();
    textBox3.Text=dataGrid1[N_row,2].ToString();
    textBox4.Text=dataGrid1[N_row,3].ToString();
    textBox5.Text=dataGrid1[N_row,4].ToString();
    string mes=N_col.ToString();;
    if (N_col==0) {mes="Сумма";}
    	if (N_col==1) {mes="Цель";}
    		if (N_col==2) {mes="Фирма";}
    			if (N_col==3) {mes="Дата";}
    				if (N_col==4) {mes="ID";}
    if (MessageBox.Show(my_ID+"\n Редактировать?",mes, 
    MessageBoxButtons.YesNo, 
    MessageBoxIcon.Question,MessageBoxDefaultButton.Button2) = 
    = DialogResult.Yes)
    	this.tabControl1.SelectedIndex=1;
    }
    Вернуться к учебному плану