我试图在C#的DataGridView中横向排列水平并垂直向下添加,但每次尝试输入数据时都会收到此错误消息:
“类型'System.InvalidCastException'的未处理异常 发生在mscorlib.dll中。附加信息:对象不能 从DBNull转换为其他类型“。
这些是我的代码:
private void tbl_valuesDataGridView_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
//totalling horizontally across rows
int val1 = Convert.ToInt32(tbl_valuesDataGridView.Rows[e.RowIndex].Cells[1].Value);
int val2 = Convert.ToInt32(tbl_valuesDataGridView.Rows[e.RowIndex].Cells[2].Value);
tbl_valuesDataGridView.Rows[e.RowIndex].Cells[3].Value = val1 + val2;
//adding vertically down the total column to get Grand Total
double sum = 0;
for (int i = 0; i < tbl_valuesDataGridView.Rows.Count; ++i)
{
sum += Convert.ToDouble(tbl_valuesDataGridView.Rows[i].Cells[2].Value);
}
textBox1.Text = sum.ToString();
}
注意事项:
我是编程新手,所以我不知道错误是由于我设置数据库表的方式,还是与我的C#代码有关。
有人可以帮帮我吗?
答案 0 :(得分:0)
对于水平加法代码,设置Cells [3] .Value等于Cells [1] .Value + Cells [2] .Value。 这没关系,但你似乎只是为了一行。
然后在你的垂直添加中,你总计了所有行的单元格[2] .Value。
如果我正确理解了代码,你应该总计Cell [3] .Value here(因为这是存储每行的总数)。
在任何情况下,您都需要转到抛出异常的行,并检查调试器Watch窗口中的每个变量。这应该告诉你哪个对象处于不正确的状态。
答案 1 :(得分:0)
有了Anik的帮助和一些调试,我能够得到我的问题的答案。对于我们这些刚接触编程的人,如果您打算使用DataGridView,您会发现此代码非常有用。始终确保为此代码使用CellEndEdit事件处理程序。
private void tbl_valuesDataGridView_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
//totalling horizontally across rows
int val1 = 0, val2 = 0, demo1;
if (int.TryParse(tbl_valuesDataGridView.Rows[e.RowIndex].Cells[1].Value.ToString().Trim(), out demo1))
val1 = Convert.ToInt32(tbl_valuesDataGridView.Rows[e.RowIndex].Cells[1].Value);
if (int.TryParse(tbl_valuesDataGridView.Rows[e.RowIndex].Cells[2].Value.ToString().Trim(), out demo1))
val2 = Convert.ToInt32(tbl_valuesDataGridView.Rows[e.RowIndex].Cells[2].Value);
tbl_valuesDataGridView.Rows[e.RowIndex].Cells[3].Value = val1 + val2;
//Adding vertically down the total column
double sum = 0;
for (int i = 0; i < tbl_valuesDataGridView.Rows.Count; ++i)
{
sum += Convert.ToDouble(tbl_valuesDataGridView.Rows[i].Cells[3].Value); //where 1 represents the index of the column you are adding
}
textBox1.Text = sum.ToString();
}