繁体   English   中英

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

[英]Adding data to data grid from another thread (in another class)


我有一个问题困扰了我好几天。.我已经尝试了许多这个网站和其他网站的教程和代码片段。 我正在构建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.线程在一个称为“服务器”的单独类中工作。 他们在那里等待传入的连接,并且当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表达式但没有成功执行此操作。 谁能指出我的错误或提供其他帮助? 我真的很感激。 附言:这是我的第一篇文章,因此,如果格式不正确,请提前致歉。 :)

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

if (dgvDown.InvokeRequired)
{...

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

您正在使用downloadFile方法创建一个全新的数据网格。 您应该更新主网格并从线程方法上调用该主网格,而不要创建一个在downloadFile方法退出时放在地板上的新网格。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM