Ячейки DataGridView не редактируются при использовании вызова внешнего потока - PullRequest
0 голосов
/ 25 апреля 2010

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

  • В главном окне создается таблица набора данных
  • Программа получает в файлы и обрабатывает их в фоновом потоке в классе TorrentBuilder : BackgroundWorker, создавая массив объектов другого класса Torrent
  • Моя программа получает эти объекты из результата BW и добавляет их в набор данных

Вышеуказанное происходит либо в моей ветке главного окна, либо в другой ветке:

У меня есть отдельный поток, который наблюдает за папкой для входящих файлов, и когда они все-таки приходят, они продолжают вызывать TorrentBuilder.RunWorkerAsynch() из этого потока, получают результат и вызывают внешний класс, который добавляет Torrent объекты в таблицу.

Когда файлы получены последним потоком, просмотр данных не редактируется. Все значения правильно отображаются в сетке данных, но когда я щелкаю ячейку, чтобы отредактировать ее: Я могу писать буквы и все, но когда я щелкаю из него, он сразу возвращается к своему первоначальному значению. Если я перезапущу программу, я смогу отредактировать те же самые ячейки.

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

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

Вот код:

Из моего главного окна класса:

private void dataGridView_DragDrop(object sender, DragEventArgs e)
{
    ArrayList al = new ArrayList();
    string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);

    foreach (string file in files)
    {
      string extension = Path.GetExtension(file);
      if (Path.GetExtension(file).Equals(".zip") || Path.GetExtension(file).Equals(".rar"))
      {
          foreach (string unzipped in dh.UnzipFile(file))
          al.Add(unzipped);
      }
      else if (Path.GetExtension(file).Equals(".torrent"))
      {
          al.Add(file);
      }
    }

dataGridViewProgressBar.Visible = true;
tb.RunWorkerCompleted += new RunWorkerCompletedEventHandler(tb_DragDropCompleted);
tb.ProgressChanged += new ProgressChangedEventHandler(tb_DragDropProgress);
tb.RunWorkerAsync()
}

void tb_DragDropCompleted(object sender, RunWorkerCompletedEventArgs e)
{
   data.AddTorrents((Torrent[])e.Result);
   builder.Dispose();
   dh.MoveProcessedFiles(data);
   dataGridViewProgressBar.Visible = false; 
}

С моей стороны Тема

while (autocheck)
{
   if (torrentFiles != null)
   {
     builder.RunWorkerAsync(torrentFiles);
     while (builder.IsBusy)
     Thread.Sleep(500);
   }
}
void builder_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
{
      data.AddTorrents((Torrent[])e.Result);
      builder.Dispose();
      dh.MoveProcessedFiles(xml);
      data.Save(); //Save just does an `AcceptChanges()` and saves to a XML file
 }

Ответы [ 2 ]

1 голос
/ 25 апреля 2010

Я думаю, что ваша проблема связана с той, с которой я столкнулся - и спрашивал об этом на SO:

DataGridView - одновременный ввод и вывод - это ошибка в DataGridView

Надеюсь, у вас больше удачи, чем у меня, в поиске хорошего решения.

0 голосов
/ 02 мая 2010

Конечно, неаккуратное решение, но единственный способ снова сделать мои клетки редактируемыми - это полное обновление.

private void DataGridViewCompleteRefresh()
        {
            dataGridView.DataSource = null;
            Thread.Sleep(100);
            dataGridView.DataSource = data.table;
            dataGridView.Columns["Site Origin"].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
            dataGridView.Columns["Year"].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
            dataGridView.Columns["Bitrate"].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
            dataGridView.Columns["Release Format"].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
            dataGridView.Columns["Bit Format"].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
            dataGridView.Columns["Handled"].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
            dataGridView.Columns["Error"].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
            dataGridView.Columns["File Path"].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
            dataGridView.Update();
            dataGridView.Refresh();
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...