0

Нет возможности приводить код и скрины, прошу понять и простить.

Раньше использовал sql команды, сейчас перехожу на entity framework. Работаю по большей части с datagridview. Нашёл довольно удобный способ работы с ним, создаю dataTable и привязываю его к dgv, дальше всю работу произвожу с dataTable. Весьма удобно то, что sql запросы возвращают мне как раз таблицы, которые легко конвертируются в dataTable и после можно либо редактировать их, либо сразу вывести на dgv.

С использованием EF таблиц больше нету. Есть экземпляры класса, в которых есть некоторые параметры. Вопрос, как адекватно загрузить их в dataTable? Собственно, что б экземпляр был строкой, а параметры - столбцы.

UPDATE

Пробую использовать DataBindings

private BindingList<dgvPriceManager> _dgvPriceManager; // в коде не обращайтесь к полю _persons, вместо этого обращайтесь к свойству Persons
        public BindingList<dgvPriceManager> dgvPriceManager
        {
            get => _dgvPriceManager;
            set
            {
                _dgvPriceManager = value;
                OnPropertyChanged();
            }
        }
    public PriceManager(List&lt;string&gt; tovars_id)
    {
        InitializeComponent();
        dataGridView1.DataBindings.Add(&quot;DataSource&quot;, this, nameof(dgvPriceManager));
        comboBox1.DataSource = tovarEdit.ToList();

        var Tovar = tovarContext.tovars.Where(n =&gt; tovars_id.Contains(n.id.ToString())).ToList();
        loadDGV1(Tovar);

        ShowDialog();
    }

    private void loadDGV1(List&lt;Tovar&gt; tovars)
    {
        dgvPriceManager = new BindingList&lt;dgvPriceManager&gt;();

        dgvPriceManager.Add(new dgvPriceManager { id = tovars.First().id.ToString(), name = tovars.First().name });
    }

В целом все работает. Получается такой себе EF для datagridview. Но есть непонятка. Слабо представляю, как без костылей и кучи кода передать инфу изList<Tovar>в dgvPriceManager. Как видно в коде, вывел ID и Name Первого товара, буду благодарен за материал, который поможет понять, как вывести все.

UPDATE 2

Пришел пока что к такому коду.

private void loadDGV1(List<Tovar> tovars)
        {
            dgvPriceManager = new BindingList<dgvPriceManager>();
        tovars.ForEach(d =&gt; dgvPriceManager.Add(new dgvPriceManager { id = d.id.ToString(), name = d.name, price_in = d.price_in, price_out = d.price_out, new_Price_in = d.price_in, new_Price_Out = d.price_out }));
    }

Цель достигнута, я вывожу информацию из DB в DGV, при этом у меня есть возможность изменять ее, как мне угодно. Сомнение у меня вызывает разве что переборка .ForEach(). Не будет ли тупняков, если у меня будет, допустим, 50 000 товаров. При привязке dgv к DataTable, приходилось брать первые 500 товаров, ибо если их больше, загрузка окна занимала до 10 секунд, что недопустимо.

Если есть советы, по улучшению этого решения, буду рад услышать.

NoMad
  • 25
  • Не надо вам больше DataTable, переходите на BindingList<T> https://ru.stackoverflow.com/a/1199692/373567 – aepot Jul 15 '22 at 16:26
  • MySql.Data.EntityFrameworkCore версия 8.0.22 Microsoft.EntityFrameworkCore версия 3.1.1 @AlexanderPetrov – NoMad Jul 15 '22 at 19:27
  • Добавил. Все верно, winforms – NoMad Jul 15 '22 at 20:18
  • @aepot Пробую ваш вариант, обновил вопрос. – NoMad Jul 15 '22 at 20:49
  • https://docs.microsoft.com/ru-RU/dotnet/api/microsoft.entityframeworkcore.changetracking.localview-1.tobindinglist – aepot Jul 16 '22 at 08:14

0 Answers0