[英]How to resolve 'System.InvalidCastException' when calculating in DataGridView C#
[英]System.InvalidCastException when work with datagridview
private void VPfn_GenInvoice()
{
int iid = Convert.ToInt16(tid.Text);
int cid = Convert.ToInt16(tcid.Text);
double subtotal = Convert.ToDouble(tst.Text);
double atax = Convert.ToDouble(tat.Text);
double discount = Convert.ToDouble(tdis.Text);
double total = Convert.ToDouble(ttotal.Text);
StringBuilder iQ = new StringBuilder();
foreach(DataRow x in invoice_data.Rows)
{
int iiid = VPfunctions.VPfn_N2ID_itm(x["item_name"].ToString());
string dQuery = "INSERT INTO `invoice_data` (id, sr, item_id, item_qty, item_unit, item_vat, amount) " +
"VALUES(" + iid + ", " + x["serial_number"].ToString() + ", " + iiid + ", " + x["item_qty"].ToString()
+ ", " + x["item_unit"].ToString() + ", " + x["item_vat"].ToString() + ", " + x["amount"].ToString() + ")";
iQ.Append(dQuery);
iQ.AppendLine();
}
//Updating main Invoice DB
string query = "INSERT INTO `invoice` ( id, cusid, cdate, mdate, subtotal, atax, discount, total) VALUES (?A,?B,?C,?D,?E,?F,?G,?H)";
xxtb.Text = iQ.ToString();
/**
try
{
//inserting into invoice
con.Open();
MySqlCommand xv = new MySqlCommand(query, con);
xv.Parameters.AddWithValue("?A", iid.ToString());
xv.Parameters.AddWithValue("?B", cid.ToString());
xv.Parameters.AddWithValue("?C", DateTime.Now.ToString());
xv.Parameters.AddWithValue("?D", "-");
xv.Parameters.AddWithValue("?E", subtotal.ToString());
xv.Parameters.AddWithValue("?F", atax.ToString());
xv.Parameters.AddWithValue("?G", discount.ToString());
xv.Parameters.AddWithValue("?H", total.ToString());
xv.ExecuteNonQuery();
//Inserting into invoice_data
MySqlCommand ixv = new MySqlCommand(iQ.ToString(), con);
ixv.ExecuteNonQuery();
}
catch
{
}
finally
{
con.Close();
} **/
}
并且出现以下错误:System.InvalidCastException:'无法将类型为'System.Windows.Forms.DataGridViewRow'的对象转换为类型为'System.Data.DataRow'。
现在,我正在尝试自己开发发票软件,但出现此错误,是的,我正在使用Visual Studio 2017RC和Windows 10 64bit。
foreach中的x
变量必须为DataGridViewRow
类型,如下修改代码:
foreach(DataGridViewRow x in invoice_data.Rows)
我的猜测是invoice_data.Rows是DataGridViewRow的集合,而您的foreach试图将其强制转换为DataRow。 如果将您的foreach更改为此,它是否有效:
foreach(DataGridViewRow x in invoice_data.Rows)
...
foreach(DataRow x in invoice_data.Rows)
该行的x
类型错误。 DataRow是抽象DataTable中的一行,而不是GUI元素DataGridView中的一行。 因为Rows属性返回一个DataGridViewRowCollection类型的对象,并且为了向后兼容,此类型仅实现IEnumerable
而不是IEnumerable<DataGridViewRow>
,因此foreach
进行无提示转换。 这就是编译器没有警告您无效转换的原因。
因此,修复很容易:
foreach(DataGridViewRow x in invoice_data.Rows)
但是, x
上的属性有些不同。 您必须使用Cells属性来获取数据。 您可以使用列名称或列索引。 其中之一应起作用:
x.Cells["item_name"].ToString()
x.Cells[0].ToString()
提供的名称是第一列。
人们已经给出了正确的答案
foreach(DataGridViewRow x in invoice_data.Rows)
但是如果有人想知道如何从datagridview读取数据,那么您必须编写以下行
foreach(DataGridViewRow x in invoice_data.Rows){
Console.WriteLine(x.Cells["ColumnName"].Value.ToString());}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.