Задача темы: изучить методику и получить навыки в разработке приложений для манипулирования записями в базах данных формата XML.
Разработка: Приложение "CARD VISA" для просмотра, добавления, редактирования, удаления записей и математической обработки данных движения средств на пластиковой карточке.
Состав выполняемых функций:
Наращивание функциональности не предусматривается.
Защита данных – от неквалифицированных действий пользователя.
В качестве входных данных используются файлы в формате XML. Выходные данные программы – графическое отображение результатов в виде текстовых полей и таблиц для SmartDevice; файлы в формате XML
Шаг 1. Разработка графического интерфейса
Для разработке используется одна форма со свойством ComboBox=False,
tabControl с двумя закладками "База данных" и
"Редактор".
На закладке "База данных" размещены надпись
"Остаток" с текстовым полем (свойство RaedOnly=True ),
кнопка поиска "Найти" и таличный элемент .
На закладке "Редактор" размещены надписи
"Сумма", "Цель", "Фирма",
"Дата" с соответствующими полями (для поля даты свойство 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 ),
кнопка поиска "Найти" и таличный элемент .
На закладке "Редактор" размещены надписи
"Сумма", "Цель", "Фирма",
"Дата" с соответствующими полями (для поля даты свойство 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;
}
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.