DataGridView cells not editable when using an outside thread call
Posted
by joslinm
on Stack Overflow
See other posts from Stack Overflow
or by joslinm
Published on 2010-04-25T00:05:32Z
Indexed on
2010/04/25
0:13 UTC
Read the original article
Hit count: 197
Hi, I'm not able to edit my datagridview cells when a number of identical calls takes place on another thread. Here's the situation:
- Dataset table is created in the main window
- The program receives in files and processes them on a background thread in class
TorrentBuilder : BackgroundWorker
creating an array objects of another classTorrent
- My program receives those objects from the BW result and adds them into the dataset
The above happens either on my main window thread or in another thread:
I have a separate thread watching a folder for files to come in, and when they do come in, they proceed to call TorrentBuilder.RunWorkerAsynch()
from that thread, receive the result, and call an outside class that adds the Torrent
objects into the table.
When the files are received by the latter thread, the datagridview isn't editable. All of the values come up properly into the datagridview, but when I click on a cell to edit it: I can write letters and everything, but when I click out of it, it immediately reverts back to its original value. If I restart the program, I can edit the same cells just fine.
If the values are freshly added from the main window thread, I can edit the cells just fine.
The outside thread is called from my main window thread, and sits there in the background. I don't believe it to be ReadOnly because I would have gotten an exception.
Here's some code:
From my main window class:
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;
}
From my outside Thread
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
}
© Stack Overflow or respective owner