Возникли проблемы с отображением списка при нажатии на кнопку в элемент управления Windows Forms DataGriedView. Дело в том что я использую список куда добавляю данные полученные из textBox-объекта и добавляю их в список с помощью команды Add(). К тому же нужно чтобы при каждом новом нажатии кнопки отображался новый объект в таблице DataGriedView c новой строки. Свойство DataSource я указываю как список(в моем случае список называется product_list). Однако, при каждом новом запуске формы после нажатия на кнопку выскакивает ошибка
System.InvalidOperationException: "Cтроки нельзя добавлять программным путем в коллекцию строк DataGridViewRow если элемент управления привязан к данным"
Если я использую просто команду this.dataGriedView1.Rows.Add() без предварительного указания свойства DataSource то в таблицу DataGriedView добавляется просто пустая строка, а мне нужно чтобы добавлялся объект с параметрами которые пользователь введет в textBox-ах
Пример моего кода на С# Windows Forms Application
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks
using System.Drawing;
using System.Text;
using System.Data;
using System.ComponentModel;
using System.Windows.Forms;
namespace NewClasssesWFA
{
public partial class Form1:Form
{
public List<Product> product_list = new List<Product>();
public List<Book> book_list = new List<Book>();
// Объявление абстрактного класса Товар
abstract public class Item
{
public string Price {get; set;} // Установить цену на товар
public string Name {get; set;} // Установить имя товара
public string Country {get; set;} // Установить страну-производителя
public string Description {get; set;} // Установить описание товара
public string Date_Package {get; set;} // Установить дату упаковки
}
public class Product: Item
{
public string Expiration {get; set;} // Срок годности
public string Amount {get; set;} // Количество
public string Units {get; set;} // Единицы измерения(кг, г, тонны, и так далее)
}
public class Book: Item
{
public string noOfPages {get;set;} // количество страниц в книге
public string PublishHouse {get; set;} // издание
public List<string> authors {get; set;} // перечень авторов книги в виде списка(или лучше всего использовать тут массив строк string [])
}
// Конструктор формы 1
public Form1()
{
InitializeComponent();
DataGridViewColumn col1 = new DataGridViewTextBoxColumn(); // создаем в самом начале столбец
col1.HeaderText = "Name"; // Задаем ему заголовок
dataGriedView1.Columns.Add(col1); // добавляем столбец в dataGriedView1(так называется моя в данном случае таблица)
// Аналогично остальные 7 столбцов с именами Price, Description, Date of Expriry, Date Package, Country, Amount, Units. C этим проблем никаких нет
}
// Та самая кнопка добавления в dataGriedView1 нового продукта в виде списка его параметров таких как Name, Price, Description и так далее в новую строку где возникает ошибка System.InvalidOperationException
private void button1_Click(object sender, EventArgs e)
{
this.dataGriedView1.Rows.Add(); // Добавляем новую строку при каждом нажатии на кнопку(в этой строке возникает ошибка в любом случае, что я создаю новую строку и передаю как параметр, что просто никаких параметров не передаю ошибка одна и та же)
product_list.Add(new Product(){//Параметры Name = textBox1.Text, ....});
dataGriedView1.DataSource = product_list; // задаем объект(список) из которого в dataGriedView1 будем выводить информацию о продукте
}
} // конец public partial class Form1:Form
} // конец namespace NewClassesWFA
Помогите пожалуйста решить эту проблему. Заранее всех благодарю за подсказки(желательно шаблон кода)
Фреймворк: .NET Core,
Шаблон проекта: Windows Forms Application
dataGriedView1.DataSource = product_list, вы привязываете контрол к данным, в этом случае он автоматически подцепляет все то, что есть в привязанной коллекции, а значит и добавлять вам надо туда, без каких-либо обращений к контролу. Но учтите, коллекция должна оповещать об изменениях, для этого есть интерфейсINotifyCollectionChanged, который стандартно реализован, например вObservableCollection<T>. Без этого оповещения, в UI у вас не будет новых данных. – EvgeniyZ Oct 16 '22 at 11:14dataGriedView1.DataSource = product_list;, дальше уберите всеdataGriedView1.Columns.Add(col1);, заменитеList<Product> product_listнаObservableCollection<Product> product_list, ну и дальше просто делайте где надоproduct_list.Add(...);. – EvgeniyZ Oct 16 '22 at 11:33