Как добавить новый ряд в DataGridView c# Winforms

244
26 марта 2022, 08:00

Гуглил много, вроде находил какие-то решения, но понимания не добавилось.

Есть такой код, выдающий ошибку "System.ArgumentException: "Длина входного массива больше числа столбцов в этой таблице."

Программа - простая редактируемая таблица, в которую надо иметь возможность добавлять строчки под соответствующие колонки при помощи textField и кнопки. Базу данных не использую, т.к. надо сделать программу standalone, поэтому она сохраняет информацию в .csv файл и считывает ее оттуда же. Как правильно в данном случае реализовать добавление новых строк?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.OleDb;
using System.Data.SqlClient;
using System.Drawing;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml;
using System.Xml.Linq;
using CsvHelper;
using ExcelDataReader;
using Microsoft.Office.Interop.Excel;
using DataTable = System.Data.DataTable;
using Excel = Microsoft.Office.Interop.Excel;

namespace WindowsFormsApp2
{
    public partial class Form1 : Form 
    {
        DataSet ds = new DataSet();
        DataTable budgetTable = new DataTable();

        public Form1()
        {
            InitializeComponent();
            DataTable budgetTable = ds.Tables.Add("MainTable");
            budgetTable.Columns.Add("date", typeof(DateTime));
            budgetTable.Columns.Add("type", typeof(String));
            budgetTable.Columns.Add("name", typeof(String));
            budgetTable.Columns.Add("expenses", typeof(Int32));
            budgetTable.Columns.Add("income", typeof(Int32));
            DataRow row = budgetTable.NewRow();
            row["date"] = dateTime.Value;
            row["type"] = cbbxType.Text;
            row["name"] = nameField.Text;
            row["expenses"] = int.Parse(expenseField.Text);
            row["income"] = int.Parse(incomeField.Text);
            budgetTable.Rows.Add(row);
            DtgTable.DataSource = budgetTable;
        }

        //adds a row to the table
        private void button1_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrWhiteSpace(cbbxType.Text) ||
                string.IsNullOrWhiteSpace(expenseField.Text))
            {
                MessageBox.Show("'Type','Expence','Income' fields cannot be 
       empty!");
            }
            else
            budgetTable.Rows.Add(dateTime.Value, cbbxType.Text, 
   nameField.Text, int.Parse(expenseField.Text), int.Parse(incomeField.Text));
        }
Answer 1

Это происходит из-за того, что строки добавляете в таблице, а не в экземпляре DataSet, который связан с DataGridView.

К тому же, если Вы захотите внести какие-то изменения в DataGridView, например добавить строку с помощью

dataGridView1.Rows.Add();

тогда получите очередное исключение, которое выглядит так:

An unhandled exception of type 'System.InvalidOperationException' occurred in System.Windows.Forms.dll
Additional information: Строки нельзя программным способом добавить в коллекцию строк DataGridView, если элемент управления привязан к данным.

Вывод: необходимо взаимодействовать с источником данных - DataSet, выбрав определенную таблицу.

Одно из решений, которое может Вам помочь.

private void button1_Click(object sender, EventArgs e)
{
    if (string.IsNullOrWhiteSpace(textBox1.Text) || string.IsNullOrWhiteSpace(textBox1.Text))
        MessageBox.Show("'Type','Expence','Income' fields cannot be empty!");
    else ds.Tables["MainTable"].Rows.Add(dateTime.Value, cbbxType.Text, nameField.Text, int.Parse(expenseField.Text), int.Parse(incomeField.Text));
}
READ ALSO
Сканирование директорий

Сканирование директорий

Ребята есть ли какой то сканер с выбором директорий для сканирования файлов определенного формата написанном на любом языке программирования...

141
внести изменения в datagrid из стороннего окна wpf

внести изменения в datagrid из стороннего окна wpf

В чем суть проблемного момента : при нажатии на кнопку добавить выскакивает новое окно, в котором я выбираю из комбобоксов аргументы для новой...

177
DataGridView сложный hedertext из нескольких стобцов

DataGridView сложный hedertext из нескольких стобцов

знаю что подобные вопросы задавали ужеНо все же, вдруг, что изменилось и теперь есть простое решение) Беда в том, что проект написан на WindowsForm...

173
Интерфейс или абстрактный класс для Null object pattern?

Интерфейс или абстрактный класс для Null object pattern?

Разрабатываю библиотеку по работе со схемой, где доменная логика следующая:

216