当在另一个线程上发生许多相同的调用时,我无法编辑我的datagridview单元格。情况如下:
TorrentBuilder : BackgroundWorker
中的后台线程上处理它们,创建另一个类Torrent
的数组对象以上情况发生在我的主窗口线程或另一个线程中:
我有一个单独的线程正在查看要进入的文件的文件夹,当它们进入时,它们继续从该线程调用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;
}
答案 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();
}