Загружаем данные:
Предварительно заведем два глобальных поля (можно и лучше это делать через свойство, но сделаем попроще)
DataSet dataSet = new DataSet();
string filePath = Application.StartupPath + "\\dataset.xml";
private void Form1_Shown(object sender, EventArgs e)
{
// Проверяем наличие файла, если на месте, то загружаем из него наш dataSet
if (File.Exists(filePath))
{
dataSet.ReadXml(filePath);
}
// Если отсутствует, создадим файл с простой структурой для 1 строки
else
{
using (XmlWriter writer = XmlWriter.Create("dataset.xml"))
{
writer.WriteStartElement("Data");
writer.WriteStartElement("rows");
writer.WriteElementString("Type", "");
writer.WriteElementString("Category", "");
writer.WriteElementString("Date", "" + DateTime.Now.ToString("dd.mm.yyy") + "");
writer.WriteElementString("Summ", "0");
writer.WriteElementString("Total", "0");
writer.WriteElementString("Comment", "");
writer.WriteEndElement();
writer.WriteEndElement();
writer.Flush();
}
}
// Заполняем датагрид
DataGridFill(dataSet);
//Подписываемся на событие добавление новой строки
dataGridView1.RowsAdded += new DataGridViewRowsAddedEventHandler(RowsAdded);
}
В случае, если у нас отсутствовал файл, программа создаст файл с 1 строкой с такой структурой:
<?xml version="1.0" standalone="yes"?>
<Data>
<rows>
<Type />
<Category />
<Date>06.03.2020</Date>
<Summ>0</Summ>
<Total>0</Total>
<Comment />
</rows>
</Data>
Далее, метод добавления новой строки:
Можем сделать не очень клёво и добавлять пустую строчку сразу в грид:
private void Add_button_Click(object sender, EventArgs e)
{
string empty = "";
string date = DateTime.Now.ToString("dd.mm.yyyy");
if (dataGridView1.Columns.Count != 0)
{
dataSet.Tables[0].Rows.Add(new object[] { empty, empty, date, empty, empty, empty });
dataGridView1.Update();
}
else
MessageBox.Show("Ошибка: Невозможно добавить строку в таблицу, в которой отсутствуют колонки",
"Ошибка",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
А можем сделать удобнее, и вызвать окно, где введем/выберем нужные нам данные.
Считать сумму можно как и при запуске, бегая циклом, так и при отрабатывании ивента dataGridView1.RowsAdded, на который мы подписались после заполнения грида:
dataGridView1.RowsAdded += new DataGridViewRowsAddedEventHandler(RowsAdded);
Например -- при запуске я немного форматирую грид и делаю такую штуку:
private void DataGridFill(DataSet dataSet)
{
if (dataSet != null)
{
dataGridView1.DataSource = dataSet.Tables[0];
for(int i = 0; i < dataSet.Tables[0].Rows.Count; i++)
{
if (string.IsNullOrEmpty(dataSet.Tables[0].Rows[i][4].ToString()))
ataSet.Tables[0].Rows[i][4] = 0;
}
for (int i = 0; i < dataSet.Tables[0].Rows.Count; i++)
{
if (i != 0 && !string.IsNullOrEmpty(dataSet.Tables[0].Rows[i][3].ToString()))
dataSet.Tables[0].Rows[i][4] = Convert.ToDouble(dataSet.Tables[0].Rows[i - 1][4]) + Convert.ToDouble(dataSet.Tables[0].Rows[i][3]);
else if (!string.IsNullOrEmpty(dataSet.Tables[0].Rows[i][3].ToString()))
dataSet.Tables[0].Rows[i][4] = dataSet.Tables[0].Rows[i][3];
}
}
dataGridView1.Columns[0].HeaderText = "Тип";
dataGridView1.Columns[1].HeaderText = "Категория";
dataGridView1.Columns[2].HeaderText = "Дата";
dataGridView1.Columns[3].HeaderText = "Сумма";
dataGridView1.Columns[4].HeaderText = "Итого";
dataGridView1.Columns[5].HeaderText = "Комментарий";
}
Но это считает строго сумму, не учитывая тега расход/доход. Что бы учитывало, нужно проверять ячейку с типом и опираясь на это уже производить математические операции.