使用外部线程调用时,DataGridView单元格不可编辑

时间:2010-04-25 00:05:33

标签: c# multithreading datagridview

当在另一个线程上发生许多相同的调用时,我无法编辑我的datagridview单元格。情况如下:

  • 数据集表在主窗口中创建
  • 程序接收文件并在类TorrentBuilder : BackgroundWorker中的后台线程上处理它们,创建另一个类Torrent的数组对象
  • 我的程序从BW结果中接收这些对象并将它们添加到数据集中

以上情况发生在我的主窗口线程或另一个线程中:

我有一个单独的线程正在查看要进入的文件的文件夹,当它们进入时,它们继续从该线程调用TorrentBuilder.RunWorkerAsynch(),接收结果,并调用添加{的外部类{1}}对象进入表格。

当后一个线程收到文件时,datagridview不可编辑。所有值都正确地显示在datagridview中,但是当我单击一个单元格进行编辑时:我可以编写字母和所有内容,但是当我单击它时,它会立即恢复为原始值。如果我重新启动程序,我可以编辑相同的单元格。

如果从主窗口线程中新添加了值,我可以编辑单元格。

外部线程从我的主窗口线程调用,并且位于后台。我不相信它是ReadOnly因为我会得到一个例外。

以下是一些代码:

从我的主窗口类:

Torrent

来自我的外部主题

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; 
}

2 个答案:

答案 0 :(得分:1)

我认为你的问题与我经历过的问题有关 - 并询问了SO:

DataGridView -- Simultaneous input and output -- Is this a bug in DataGridView

我希望你在提出一个好的解决方案时比我更幸运。

答案 1 :(得分:0)

一个草率的解决方案当然,但我能让我的细胞再次编辑的唯一方法就是彻底刷新。

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();
        }