0

Возникли проблемы с отображением списка при нажатии на кнопку в элемент управления 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 = &quot;Name&quot;; // Задаем ему заголовок 
   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:14
  • А можно пожалуйста показать шаблон кода для наглядности? – Venom ___Manny Oct 16 '22 at 11:21
  • Какой шаблон вы хотите? Я вам прямым текстом указал на ваши ошибки. Сделайте один раз, при инициализации окна dataGriedView1.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

0 Answers0