ошибка обновления источника данных DataGridView из BackgroundWorker - PullRequest
1 голос
/ 09 сентября 2011

У меня есть DataGridView, который использует DataTable для своего источника данных.У меня также есть BackgroundWorker, который обновляет объект DataTable.Это вызывает исключение IndexOutOfRange при обновлении объекта DataTable.Если я обновил DataTable в главном потоке пользовательского интерфейса, исключений не будет.

Как я могу предотвратить это исключение?Я только обновляю DataTable, не переназначая источник данных.

public partial class Form1 : Form
{
     DataTable myData = null;
     BackgroundWorker worker = new BackgroundWorker();

     public Form1()
    {
        InitializeComponent();
        myData = new DataTable();         
    }

     private void Form1_Load(object sender, EventArgs e)
    {
        dataGridView1.DataSource = myData;
    }

     private void button1_Click(object sender, EventArgs e)
    {
         worker.DoWork += new DoWorkEventHandler(PopulateData);
         worker.RunWorkerAsync();
    }

     private void PopulateData(object sender, DoWorkEventArgs e)
    {
          ......
          //update datatable
          myDataAdapter.Fill(myData); //Exception caused by this call
     }
}

Редактировать: я могу обойти это, создав второй объект DataTable и обновив его, затем установив Datasource DataTable = обновленный DataTable вBackgroundWorker RunWorkerCompleted событие, но наличие двух DataTables кажется немного глупым и пустой тратой ресурсов.

Редактировать: исключение выдается на

Application.Run(new Form1());

в Program.cs, т.е. непо моему коду.

Ответы [ 2 ]

0 голосов
/ 09 сентября 2011

У меня была та же проблема, что и у вас, за исключением того, что мое представление данных было привязано к списку.Проблема возникла у меня, когда я сказал очистить список, чтобы потом добавить новые значения, чтобы список не был неправильным.Я решил это, изменив источник данных на что-то другое, сделал то, что мне было нужно, затем переключил его обратно, однако это не самый лучший способ обхода.

Независимо от того, хорошо это или нет, изменение источника данных - самая безопасная ставка.в данный момент.Однако вместо создания второй таблицы данных было бы гораздо лучше:

dataGridView1.DataSource = null;

Таким образом, вам не нужно беспокоиться о создании другой таблицы данных.

0 голосов
/ 09 сентября 2011

старайтесь не создавать DataTable там, где он вам пока не нужен.

Я бы удалил это:

myData = new DataTable();

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

Я бы тогда назвал это:

dataGridView1.DataSource = myData;

только когда вся загрузка завершена рабочим потоком.

...