Ответы пользователя по тегу Windows Forms
  • Ошибка при добавлении новой строки с таким же названием?

    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 = "Комментарий";
    }


    Но это считает строго сумму, не учитывая тега расход/доход. Что бы учитывало, нужно проверять ячейку с типом и опираясь на это уже производить математические операции.
    Ответ написан
    Комментировать