Как сделать автоматическое сложение или вычитание
Подскажите пожалуйста как можно сделать так, что если я добавляю новую строку с данными в БД, вставленную в datagridview, эта строка сама инициализировалась по типу (доход или расход) и соответственно автоматически добавлялась к итоговой сумме "Дохода" или автоматически вычиталась от итоговой суммы "Расхода". чтобы не вводить на каждую добавленную строку отдельный код. если можно объяснить подробно, потому что я пока разбираюсь в этом и могу чего то не понять, буду признателен
Код добавления новой строки:
private void AddButton_Click(object sender, EventArgs e) {
Form1 main = this.Owner as Form1;
if (main != null) {
DataRow nRow = main.база_данныхDataSet.Tables[0].NewRow();
int rc = main.dataGridView1.RowCount + 1;
nRow[0] = rc;
nRow[1] = tbType.Text;
nRow[2] = tbCategory.Text;
nRow[3] = tbDate.Text;
nRow[4] = tbSum.Text;
// nRow[5] = tbTotal.Text;
nRow[6] = tbComments.Text;
main.база_данныхDataSet.Tables[0].Rows.Add(nRow);
main.accountingTableAdapter.Update(main.база_данныхDataSet.Accounting);
main.база_данныхDataSet.Tables[0].AcceptChanges();
main.dataGridView1.Refresh();
tbType.Text = " ";
tbCategory.Text = " ";
tbDate.Text = " ";
tbSum.Text = " ";
// tbTotal.Text = " ";
tbComments.Text = " ";
}
}
Код, который вычисляет сумму и разность, прописанный вручную, действующий только на имеющиеся строки.
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) {
dataGridView1.Rows[0].Cells[5].Value = Convert.ToString(Double.Parse(dataGridView1.Rows[0].Cells[4].Value.ToString()));
dataGridView1.Rows[1].Cells[5].Value = Convert.ToString(Double.Parse(dataGridView1.Rows[0].Cells[5].Value.ToString()) + Double.Parse(dataGridView1.Rows[1].Cells[4].Value.ToString()));
dataGridView1.Rows[2].Cells[5].Value = Convert.ToString(Double.Parse(dataGridView1.Rows[1].Cells[5].Value.ToString()) + Double.Parse(dataGridView1.Rows[2].Cells[4].Value.ToString()));
dataGridView1.Rows[3].Cells[5].Value = Convert.ToString(Double.Parse(dataGridView1.Rows[2].Cells[5].Value.ToString()) - Double.Parse(dataGridView1.Rows[3].Cells[4].Value.ToString()));
dataGridView1.Rows[4].Cells[5].Value = Convert.ToString(Double.Parse(dataGridView1.Rows[3].Cells[5].Value.ToString()) - Double.Parse(dataGridView1.Rows[4].Cells[4].Value.ToString()));
dataGridView1.Rows[5].Cells[5].Value = Convert.ToString(Double.Parse(dataGridView1.Rows[4].Cells[5].Value.ToString()) - Double.Parse(dataGridView1.Rows[5].Cells[4].Value.ToString()));
}
Ответы (1 шт):
Автор решения: Bulson
→ Ссылка
private void ButtonAdd_Click(object sender, EventArgs e)
{
//если это не первая запись в таблице
if (_dataSet.Tables[0].Rows.Count > 0)
{
//сначала находим максимальный Id
var lastId = _dataSet.Tables[0].AsEnumerable().Max(r => r.Field<int>("Id"));
//находим последнюю запись
var lastRow = _dataSet.Tables[0].AsEnumerable()
.First(r => r.Field<int>("Id") == lastId);
//вычисляем значение Итого
decimal lastTotal = lastRow.Field<decimal>("Total");
string type = _comboBoxType.Text;
decimal current = 0;
if (decimal.TryParse(_textBoxSum.Text, out decimal sum))
{
current = (type.Equals("Доход") ? 1 : -1) * sum;
}
//создаем новую строку
var row = _dataSet.Tables[0].NewRow();
row["Type"] = type;
row["Category"] = _comboBoxCategory.Text;
row["Date"] = _dateTimePicker.Value;
row["Sum"] = sum;
row["Total"] = lastTotal + current;
_dataSet.Tables[0].Rows.Add(row);
}
else
{
// в случае первой записи в таблицу...
}
//пишем в БД
try
{
using (var adp = new SqlDataAdapter(_selectString, _conString))
using (var cmb = new SqlCommandBuilder(adp))
{
var added = adp.Update(_dataSet.Tables[0]);
Trace.WriteLine($"Добавлено {added}");
}
_dataSet.Tables[0].AcceptChanges();
_dataGridView.Refresh();
}
catch (Exception ex)
{
Trace.WriteLine(ex.Message);
}
}
