Datagridview NullReferenceException 在计时器中续订时出错

Datagridview NullReferenceException Error when renewing in timer

提问人:Mustafa Ozbalci 提问时间:12/15/2021 更新时间:12/16/2021 访问量:47

问:

我有一个应用程序,我需要获取某个数字作为参考值以发送到 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.'

我已经尽了一切努力来避免这个问题,但不幸的是,我找不到我需要做的事情。

我相信我的代码做错了什么,但我无法弄清楚。

C# DataGridView NullReferenceException

评论

0赞 JohnG 12/15/2021
这回答了你的问题吗?什么是 NullReferenceException,如何修复它?
0赞 Mustafa Ozbalci 12/15/2021
我读了这篇文章,它对我很有用,但这篇文章无法帮助我找到解决方案。我正在使用这种方法,我已经延迟更新了数据库上的任何记录,但也无法解决。仍然崩溃并出现相同的错误。
0赞 JohnG 12/15/2021
井。。。如果您 100% 确定错误来自发布的代码...然后。。。哪一行代码会抛出此错误...在发布的代码“哪里”不会抛出此错误的地方。当抛出错误时,“应该”告诉你哪一行代码抛出了错误。这是“隔离”罪魁祸首的唯一方法,尤其是在错误不一致的情况下。
0赞 Mustafa Ozbalci 12/15/2021
通常是这部分,但大多数时候在 Program.cs 崩溃 我正在使用数据网格来显示 que 信息。with 和 我相信当这个值无法读取错误占用者时。dgv.DataSource = dt;Application.Run(new frmMain());dgv.SelectedRows[0].Cells[0].Value.ToString()
1赞 JohnG 12/15/2021
“通常这部分”......?...什么部分?...如果您无法告诉我们哪一行代码引发了错误,我建议您创建一个最小的可重现示例来重现错误。否则,这将是纯粹的猜测。如果您不熟悉“调试”代码...现在是学习的好时机。当知道这是一个例外时......但是“哪一行”代码会抛出这个错误?说错误在“这部分”......不会帮助我们帮助你。null

答:

1赞 Oak_3260548 12/16/2021 #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

评论

1赞 Mustafa Ozbalci 12/16/2021
谢谢解决了我的问题,我也减少了读数。我只在需要时阅读表格。现在我让它运行了大约 4 个小时,到目前为止没有错误