Datagridview NullReferenceException 在计时器中更新时出错
Posted
技术标签:
【中文标题】Datagridview NullReferenceException 在计时器中更新时出错【英文标题】:Datagridview NullReferenceException Error when renewing in timer 【发布时间】:2021-12-14 23:06:37 【问题描述】:我有一个应用程序,我需要将某个数字作为参考值发送到 PLC。为此,我从数据库中获取所有行并将它们列在我的 datagridview (dgv) 上,并使用计时器重新加载带有更新行的 datagridview。要加载数据,我使用下面的代码;
public void updatedgv()
try
using (SqlConnection con = new SqlConnection(Program.sqlcon))
string q = "SELECT CONCAT(RL.istekID,'-',RL.lineID) '#',M.makName 'Makine Adı',R.partiNo 'PartiNo',C.kimAd 'Kimyasal',RL.miktar 'Miktar',RL.durum 'Durum', RL.lineID 'Kuyruk No' FROM RECLN RL JOIN REC R ON RL.istekID=R.istekID JOIN MAK M ON R.makID=M.makID JOIN CHEM C ON C.kimID=RL.kimID WHERE RL.durum IN (1,2)";
using (SqlCommand com = new SqlCommand(q, con))
if (con.State == ConnectionState.Closed) con.Open(); else con.Close(); con.Open();
using (SqlDataAdapter sda = new SqlDataAdapter(com))
try
dt = new DataTable();
sda.Fill(dt);
dgv.DataSource = dt;
catch (Exception ex) this.Text = ex.Message;
catch (Exception ex) this.Text = ex.Message;
但偶尔会出现以下错误,我的应用程序停止工作。
System.NullReferenceException: 'Object reference not set to an instance of an object.'
我已尽一切努力避免这个问题,但不幸的是,我找不到我需要做的事情。
我认为我的代码有问题,但我无法弄清楚。
【问题讨论】:
这能回答你的问题吗? What is a NullReferenceException, and how do I fix it? 我读过这一篇,它对我很有用,但是这一篇无法帮助我找到解决方案。我正在使用这种方法,我延迟更新了数据库中的任何记录,但也无法解决。仍然因同样的错误而崩溃。 好吧...如果您 100% 确定错误来自发布的代码...那么...哪一行代码会引发此错误...发布的代码“在哪里”会引发此错误。抛出错误时,“应该”告诉您哪一行代码抛出了错误。这是“隔离”罪魁祸首的唯一方法,尤其是在错误不一致的情况下。 通常这部分dgv.DataSource = dt;
但大多数时候在Application.Run(new frmMain());
的Program.cs 崩溃我正在使用数据网格来显示查询信息。使用dgv.SelectedRows[0].Cells[0].Value.ToString()
,我相信当这个值无法读取错误发生时。
“通常是这部分” ... ? … 哪一部分? … 如果你不能告诉我们哪行代码抛出了错误,我建议你创建一个minimal reproducible example 来重现错误。否则这将是纯粹的猜测。如果您不熟悉“调试”您的代码……现在是学习的好时机。当知道这是一个null
异常时……但是“哪”行代码抛出了这个错误?说错误出现在 “这部分” ...不会帮助我们帮助您。
【参考方案1】:
你应该在你的问题上付出更多的努力,当你不清楚时,它浪费了可以提供帮助的人的时间并且很难回答。
我怀疑您的设计存在一些根本性错误。
首先,如果你只需要数据库中的一些数据,那么不要拉出所有要处理的表(也就是从中取一个值),而是将过滤器放入SQL语句中并获取一个标量值(或减少的结果集,任何适当的)。
要回答这个问题,为了避免您得到的错误(假设它来自您提到的单元格的读取,这实际上很可能),您只需要确保您正在读取现有单元格和现有值:
if (dgv.Rows.Count > 0) // check row exists, to work with a row
DataGridViewRow irow = dgv.Rows(0);
if (dgv.Columns.Count > 0) // check column exists, to work with a row
// Dim icol As DataGridViewColumn = dgv.Columns(0) ' <<< if column reference needed
DataGridViewCell icell = irow.Cells(0);
if (!IsDBNull(icell) && !IsNothing(icell)) // check cell is not empty
myResult = icell.Value.ToString();// <<< Mind datatypes and type conversions! Not shown here!
我的猜测是,有时您会在该单元格中获得 dbnull
值,然后您的程序就会崩溃。
【讨论】:
谢谢它解决了我的问题,我也减少了读数。我只在需要时阅读表格。现在我让它运行了大约 4 个小时,到目前为止没有错误以上是关于Datagridview NullReferenceException 在计时器中更新时出错的主要内容,如果未能解决你的问题,请参考以下文章