提问人:Mustafa Ozbalci 提问时间:12/15/2021 更新时间:12/16/2021 访问量:47
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.'
我已经尽了一切努力来避免这个问题,但不幸的是,我找不到我需要做的事情。
我相信我的代码做错了什么,但我无法弄清楚。
答:
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 个小时,到目前为止没有错误
评论
dgv.DataSource = dt;
Application.Run(new frmMain());
dgv.SelectedRows[0].Cells[0].Value.ToString()
null