从另一个线程(在另一个类中)向数据网格添加数据

时间:2012-07-09 14:15:49

标签: c# multithreading


我有一个问题一直让我疯了几天..我已经尝试过很多来自这个和许多其他网站的教程和代码片段。我正在构建一个P2P应用程序,我在访问主线程时遇到了问题 以下是我申请的简单流程:
1.显示frmMain - 用户点击登录按钮
2.显示frmlogin - 用户输入他的名字
3.“登录”后 - 创建两个线程(threadTCPlistener和threadUDPlistener)
4. frmDataGrid显示为

Server listen = new Server();
Thread listeningUDPThread = new Thread(new ThreadStart(listen.startUDPServer));
listeningUDPThread.IsBackground = true;
listeningUDPThread.Start();
Thread listeningTCPThread = new Thread(new ThreadStart(listen.startTCPServer));
listeningTCPThread.IsBackground = true;
listeningTCPThread.Start();
frmDataGrid dg = new frmDataGrid();
dg.Show();

5.Threads在一个名为“Server”的单独类中工作。在那里,他们等待传入连接,当TCP线程接受连接时,它开始接收文件。收到文件后,我想更改frmDataGrid中的GUI以向网格视图添加新行。我做过这样的事情:

public void downloadFile()
{
     //--receiving of the file--
     frmDataGrid fdg = new frmDataGrid();
     //filename is the name of received file, and 100's are just for testing (for now).    
     fdg.verifyUIRequest(fileName, 100, 100);
}

我正在调用frmDataGrid VerifyUIRequest中的方法,如下所示:

 public void verifyUIRequest(string filename, int done, int percent)
     {
     if (dgvDown.InvokeRequired)
         {
         dgvDown.Invoke((MethodInvoker)delegate { updateDownDgv(filename, done, percent);  });
         }
     else
     {
         updateDownDgv(filename, done, percent);
     }

在此之后,主线程应调用“updateDownDgv”方法,但问题是我的数据网格没有发生任何事情。以下是更新代码:

public void updateDownDgv(string filename, int done, int percent)
{
foreach (DataGridViewRow r in dgvDown.Rows)
{
        if ((string)r.Cells[0].Value == filename)
                {
                    r.Cells[1].Value = done;
                    r.Cells[2].Value = percent;
                }
                dgvDown.Invalidate();
                return;
 }
 DataTable tab = (DataTable)dgvDown.DataSource;
 DataRow row =  tab.NewRow();
 row[0] = filename;
 row[1] = percent;
 row[2] = done;
 //MessageBox.Show(done.ToString());
 tab.Rows.Add(row);
 dgvDown.DataSource = null;
 dgvDown.DataSource = tab;
 }

我已尝试使用一些lambda表达式开始调用,但没有成功。任何人都可以指出我的错误或以其他方式帮助?我真的很感激。 PS这是我的第一篇文章,所以如果格式不好,我会提前道歉。 :)

编辑: 所以问题显然是实例,所以我做了这样的事情: 从我创建我的frmDataGrid类的实例的Server类,我现在称它为带有3个参数的构造函数。     frmDataGrid fdg = new frmDataGrid(fileName,100,100); 在那个构造函数中,在frmDataGrid中,我调用了verifyUIRequest。但是又发生了另一个错误,我似乎无法弄明白。它停在

if (dgvDown.InvokeRequired)
{...

错误如下: “对象引用未设置为对象的实例”,即NullReferenceException。可能是什么错误?

1 个答案:

答案 0 :(得分:0)

您正在downloadFile方法中创建全新的数据网格。你应该从你的线程方法更新主网格和调用方法,而不是在downloadFile方法退出时创建一个新的网格。