Обновление DataGridView из другой формы с помощью BackGroundWorker - PullRequest
1 голос
/ 01 июня 2010

У меня есть одна форма (LoginForm), в которой есть фоновый работник, отслеживающий базу данных для новых записей.

Затем у меня есть другая форма (AdminForm), о которой мне нужно сообщить, чтобы обновить свои сетки данных при появлении новых данных.

Я мог бы также опрашивать базу данных в AdminForm, но, учитывая, что LoginForm уже выполняет некоторые опросы, которые могут быть дорогостоящими, я просто хочу сообщить AdminForm, чтобы обновить DataGridViews новыми данными.

Вы можете спросить, почему LoginForm выполняет опрос, когда вы показываете материал в AdminForm? Итак, LoginForm на самом деле обрабатывает данные и отправляет их через последовательный порт: $ heheh. Я хочу, чтобы он мог обрабатывать данные без постоянного входа администратора.

1 Ответ

2 голосов
/ 01 июня 2010

Возможно, ваш фоновый рабочий сигнал прогрессирует (свойство WorkerReportsProgress имеет значение true, затем вызывается ReportProgress).

В этом обработчике событий (OnProgressChanged) вызовите другое создаваемое вами публичное событие, сигнализирующее получателям о необходимости обновления данных. Ваша административная форма может подписаться на это событие.

Поскольку я не совсем уверен, вызывается ли событие OnProgressChanged в контексте основного потока или в контексте потока фонового работника, я бы рекомендовал использовать this.Invoke при фактическом обновлении пользовательского интерфейса. .

EDIT
Используя OnProgressChanged и другое событие, сделайте следующее:

В классе Form1 объявите новое событие, например

public event EventHandler DataChanged;

Кроме того, объявите метод, который вызывает событие:

protected void OnDataChanged()
{
    if (DataChanged != null)
        DataChanged(this, EventArgs.Empty);
}

Затем в методе OnProgressChanged вызовите метод OnDataChanged.

Все, что вам нужно сделать сейчас, это:

  1. Прикрепите Form2 к событию в Form1, используя что-то вроде form1.DataChanged += new EventHandler....
  2. В этом обработчике событий обновите элементы управления в Form2

Например, вы можете передать текущий экземпляр Form1 в конструктор Form2 при его создании и присоединить обработчик событий в конструкторе Form2. Есть и другие варианты.

РЕДАКТИРОВАТЬ 2
Подумайте об этом: почему бы вам не поместить код опроса в отдельный класс, который предоставляет событие при изменении данных. Затем вы можете прикрепить Form1 и Form2 к этим событиям. Это сделает форму 2 независимой от формы 1.

...