在计时器中更新时 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
值,然后您的程序就会崩溃。
我有一个应用程序,我需要获取某个数字作为参考值以发送到 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
值,然后您的程序就会崩溃。