在计时器中更新时 Datagridview NullReferenceException 错误

Datagridview NullReferenceException Error when renewing in timer

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

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

我认为我的代码有问题,但我无法弄清楚。

你应该更加努力地回答你的问题,它浪费了可以提供帮助的人的时间,并且在不清楚的时候很难回答

我怀疑您的设计存在一些根本性错误。

首先,如果您只需要数据库中的一些数据,那么不要将所有 table 都拉出来进行处理(也就是从中取一个值),而是将过滤器放入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 值,然后您的程序就会崩溃。