ОБНОВЛЕНИЕ! - я частично выяснил ответ на вопрос part # 1 в книге "Pro .NET 2.0 Windows Forms и средства управления клиентами в C #" «
Первоначально я думал, что Refresh () ничего не делает и что мне нужно вызвать метод Invalidate () , чтобы сказать Windows перекрасить мой элемент управления на досуге , (что обычно сразу, но если вам нужна гарантия перекрасить его сейчас , то немедленно вызовите метод Update ().)
dataGridView1.Invalidate();
Но оказывается, что метод Refresh () является просто псевдонимом для:
dataGridView1.Invalidate(true);
dataGridView1.Update(); // <== forces immediate redraw
Единственный сбой, который я обнаружил при этом, заключался в том, что если бы в dataGridView не было данных, никакое количество аннулирования не обновило бы элемент управления. Я должен был переназначить источник данных. Тогда это работало нормально после этого. Но только для количества строк (или элементов в моем списке) - если бы были добавлены новые элементы, dataGridView не знал бы, что было бы больше строк для отображения.
Таким образом, кажется, что при привязке источника данных (Список или Таблица) к Источнику данных dataGridView подсчитывает элементы (строки), а затем устанавливает это внутренне и никогда не проверяет, есть ли новые строки / элементы или строки / элементы удалены. Вот почему повторная привязка источника данных неоднократно работала раньше.
Теперь, чтобы выяснить, как обновить количество строк, отображаемых в dataGridView, без необходимости повторной привязки источника данных ... весело, весело, весело! : -)
После некоторого копания, я думаю, что у меня есть ответ на часть # 2 моего вопроса (он же безопасная многопоточность):
Вместо того, чтобы использовать System.Timers.Timer , я обнаружил, что вместо этого я должен использовать System.Windows.Forms.Timer .
Событие происходит так, что метод, который используется в обратном вызове, автоматически происходит в основном потоке. Нет проблем с многопоточностью!
Объявление выглядит так:
private static System.Windows.Forms.Timer refreshWindow2;
refreshWindow2 = new Timer();
refreshWindow2.Interval = 1000;
refreshWindow2.Tick += new EventHandler(refreshWindow2_Tick);
refreshWindow2.Start();
И метод такой:
private void refreshWindow2_Tick(object sender, EventArgs e)
{
dataGridView1.Invalidate();
}