繁体   English   中英

使用datagridview时发生System.InvalidCastException

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM