以下代码(完全相同)在另一个项目上正常运行。
private void AddComboBoxCells()
{
DataGridViewComboBoxCell dgvcell;
_query = "select ProductName from Product";
com = new SqlCommand(_query, con);
for (int i = 0; i < dataGridView1.Rows.Count - 1; i++)
{
dgvcell = new DataGridViewComboBoxCell();
dataGridView1[1, i] = dgvcell;
myrdr = com.ExecuteReader();
while (myrdr.Read())
{
dgvcell.Items.Add(myrdr.GetValue(0));
}
myrdr.Close();
}
}
在这个项目上,我正在尝试运行相同的代码,但我在运行时遇到以下错误:
我正在做的是提取记录,即产品名称,并将其填入datagridviewcomboboxcell的第二列。
修改
private void btnAdd_Click(object sender, EventArgs e)
{
DataRow dtr = tblOrders.NewRow();
tblOrders.Rows.Add(dtr);
DataGridViewComboBoxCell dgvcell;
_query = "select * from Product";
com = new SqlCommand(_query, con);
dgvcell = new DataGridViewComboBoxCell();
dataGridView1[1, dataGridView1 .Rows.Count -2 ] = dgvcell;
myrdr = com.ExecuteReader();
while (myrdr.Read())
{
dgvcell.Items.Add(myrdr[0]);
}
myrdr.Close();
}
此添加按钮代码有效,因此进入的数据肯定有效。请协助。
答案 0 :(得分:2)
首先,您可能希望将处理程序附加到DataGridView控件的DataError事件,以获取有关您所获得的错误的更多信息。
其次,要检查的显而易见的事情是您在第二个项目中使用的数据上下文。它似乎很可能不一定是编程错误,而更像是与您正在查询和/或进行数据绑定的基础数据相关的问题。
您可能需要调查查询返回的数据类型和值:select ProductName from Product
。
查看myrdr.getValue(0)
- 重写行dgvcell.Items.Add(myrdr.GetValue(0));
,如下所示:
object val = myrdr.GetValue(0);
dgvcell.Items.Add(val); // put a break-point here and check val
修改强>
要回答有关如何处理DataError事件的问题,您只需将处理程序附加到“dataGridView1”对象的事件成员(如果您不知道哪些事件是什么,或者如何附加处理C#中的事件然后我建议你在网上做一些阅读 - 到处都有大量的资源)
// you will want to add this code to attach the handler in your initialization code - maybe in the Load event handler
dataGridView1.DataError += new DataGridViewDataErrorEventHandler(DataGridView1);
// ....
// an then define this function somewhere in your class to handle the event
private void DataGridView1_DataError(object sender, DataGridViewDataErrorEventArgs anError)
{
// this function will be called when an error occurs.
// you can then use the anError paramenter to get insight into the type and cause of the error
}
答案 1 :(得分:2)
您的第二个项目中是否有有效数据?我猜测您对myrdr.GetValue(0)
的调用在某个时刻返回null(或其他一些虚假值)?