Я не могу редактировать свои ячейки таблицы данных, когда в другом потоке происходит несколько идентичных вызовов. Вот ситуация:
- В главном окне создается таблица набора данных
- Программа получает в файлы и обрабатывает их в фоновом потоке в классе
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
}