@nikitasalnikov
Новичок

Ошибка при добавлении новой строки с таким же названием?

5eb1a598641c8052288470.jpeg

Здравствуйте. Есть такая таблица. сделал кнопку для добавления новой строки в данной таблице при запуске программы. Появляется ошибка при добавлении новой строки с таким же названием. как исправить? И можно ли как то сделать чтобы при добавлении новой строки, при вводе в строке "Тип - Доход" она автоматически распознавалась как имеющийся уже такой тип и "Сумма" новой строки складывалась автоматически с одной из строк с таких же строк?

private void AddBtn_Click(object sender, EventArgs e)
        {
            
            Form1 main = this.Owner as Form1;
            if (main != null)
            {
                DataRow nRow = main.база_данныхDataSet.Tables[0].NewRow();
               int rc = main.база_данныхDataSet.RowCount + 1;
                nRow[0] = rc;
                nRow[1] = tbType.Text;
                nRow[2] = tbCategory.Text;
                nRow[3] = tbDate.Text;
                nRow[4] = Convert.ToInt32(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 = "";
                
               
            }
        }
  • Вопрос задан
  • 167 просмотров
Пригласить эксперта
Ответы на вопрос 2
Collin
@Collin
Загружаем данные:
Предварительно заведем два глобальных поля (можно и лучше это делать через свойство, но сделаем попроще)
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 = "Комментарий";
}


Но это считает строго сумму, не учитывая тега расход/доход. Что бы учитывало, нужно проверять ячейку с типом и опираясь на это уже производить математические операции.
Ответ написан
Комментировать
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
Программирование довольно нудная штука.
Вы описываете действие, и переводите его с человеческого языка на известный вам язык программирования.
В идеале у вас есть ТЗ и вы тупо вставляете конструкции.
В вашем случае нужно зайти на описание этого контрола и изучить его "Жизненный цикл"

Простым языком при добавлении он создает кучу событий, вы выбираете нужное и в нем выполняете код который вам нужен.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы