hekkaaa
@hekkaaa
C#/.NET Developer

Как обновлять данные Winform в таблице DataGrid.DataSource динамически?

Привет.
После долгого гугла вопроса, подходящего ответа я так и не нашел.

Проблема следующая:
Есть простой пример таблицы заливающаяся в DataGrid.DataSource

private List<Class1> Grep()
        {
            

            List<Class1> returns = new List<Class1>
            {
                new Class1{IdNum = _count},
                new Class1{IdNum = _count},
                new Class1{ IdNum = 1},
                new Class1{ IdNum = 1},
                new Class1{IdNum = 1},
                new Class1{IdNum = 1},
                new Class1{IdNum = 1},
            };
            
            return returns;
        }


Я с помощью поля _count делаю ++ желая увидеть динамическое повышение значения на 1.
Привязал запуск таблицы и наполнение к нажатию кнопки. Но данные в таблице не хотят динамическт показываться, а сразу выплевывается результат после FOR.
Я пробывал:
dataGridView1.DataSource = null;
dataGridView1.Refresh();
dataGridView1.Update();


Результата всегда 2 либо ничего вообще, либо выплёвывается только конечный результат.

Пример как я запускаю без вышеуказанных апдейтов:
private void btnClickStart_Click(object sender, EventArgs e)
        {  
            dataGridView1.DataSource = Grep();
            
            for(int i = 0; i < 10; i++)
            { 
              dataGridView1.DataSource = Grep();
                _count++;
                Thread.Sleep(300);
            }


Вопрос: как правильно получить желаемый результат. Конечный вариант желателен в цикле while(true) и видеть постоянно обновления.
  • Вопрос задан
  • 989 просмотров
Решения вопроса 1
hekkaaa
@hekkaaa Автор вопроса
C#/.NET Developer
Ответ нашел сам. Спустя 500 попыток.
Есть 2 Варианта:
Самый верный динамический вариант это менять конкретные элементы строк
dataGridView1[0,1].Value = "Какое то новое значение".

dataGridView1.Update();
dataGridView1.Refresh();
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
edward_freedom
@edward_freedom
dataGridView1[0,1].Value = "Какое то новое значение".

тебе надо изменять данные в самом обьекте, а не в dataGridView1.
dataGridView1.DataSource = Grep();

вызывать несколько раз не надо, указал обьект один раз и дальше с ним работай.
dataGridView1.Refresh();
dataGridView1.Update();

не имеет смысла, когда есть INotifyPropertyChanged

public class User : INotifyPropertyChanged
    {
        private string _name;
        private int _age;

        public string Name
        {
            get => _name;
            set { _name = value; OnPropertyChanged(); }
        }

        public int Age
        {
            get => _age;
            set { _age = value; OnPropertyChanged(); }
        }

        public User() { }
        public User(string name, int age)
        {
            Name = name;
            Age = age;
        }

        public event PropertyChangedEventHandler PropertyChanged;

        [NotifyPropertyChangedInvocator]
        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }


var itemStates = new List<User>()
            {
                new User("Анимэшник", 0),
                new User("Не анимэшник", 18)
            };

            var bindingList = new BindingList<User>(itemStates);
            var source = new BindingSource(bindingList, null);
            dataGridView1.DataSource = source;


            await Task.Run(async () =>
            {
                for (int i = 18; i < 30; i++)
                {
                    await Task.Delay(1000);
                    itemStates.Where(user => user.Name.Equals("Не анимэшник")).FirstOrDefault().Age = i;
                }
            });
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы