Гуглил много, вроде находил какие-то решения, но понимания не добавилось.
Есть такой код, выдающий ошибку "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));
}
Это происходит из-за того, что строки добавляете в таблице, а не в экземпляре 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));
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Ребята есть ли какой то сканер с выбором директорий для сканирования файлов определенного формата написанном на любом языке программирования...
В чем суть проблемного момента : при нажатии на кнопку добавить выскакивает новое окно, в котором я выбираю из комбобоксов аргументы для новой...
знаю что подобные вопросы задавали ужеНо все же, вдруг, что изменилось и теперь есть простое решение) Беда в том, что проект написан на WindowsForm...
Разрабатываю библиотеку по работе со схемой, где доменная логика следующая: