【问题标题】:linq cast errorlinq 转换错误
【发布时间】:2016-02-04 19:35:00
【问题描述】:

我正在尝试使用 Linq 从 DataTable 中获取一些数据,但它给了我以下错误: 指定的演员表无效。

首先,我用它把复制的单元格从excel粘贴到datagridview

        private void btnExcel_Click(object sender, EventArgs e)
    {

        dataGridView1.Columns.Clear();
        dataGridView1.Columns.Add("Column1", "Column1");
        dataGridView1.Columns.Add("Column2", "Column2");
        dataGridView1.Columns.Add("Column3", "Column3");
        dataGridView1.Columns.Add("Column4", "Column4");
        dataGridView1.Columns.Add("Column5", "Column5");
        dataGridView1.Columns.Add("Column6", "Column6");
        dataGridView1.Columns.Add("Column7", "Column7");
        dataGridView1.Columns.Add("Column8", "Column8");
        dataGridView1.Columns.Add("Column9", "Column9");
        dataGridView1.Columns.Add("Column10", "Column10");
        dataGridView1.Columns.Add("Column11", "Column11");
        dataGridView1.Columns.Add("Column12", "Column12");
        dataGridView1.Columns.Add("Column13", "Column13");

        DataObject o = (DataObject)Clipboard.GetDataObject();
        if (o.GetDataPresent(DataFormats.UnicodeText))
        {
            if (dataGridView1.RowCount > 0)
                dataGridView1.Rows.Clear();

            string[] pastedRows = Regex.Split(o.GetData(DataFormats.UnicodeText).ToString().TrimEnd("\r\n".ToCharArray()), "\r\n");
            int j = 0;
            foreach (string pastedRow in pastedRows)
            {
                string[] pastedRowCells = pastedRow.Split(new char[] { '\t' });

                dataGridView1.Rows.Add();
                int myRowIndex = dataGridView1.Rows.Count - 1;

                using (DataGridViewRow myDataGridViewRow = dataGridView1.Rows[j])
                {
                    for (int i = 0; i < pastedRowCells.Length; i++)
                        myDataGridViewRow.Cells[i].Value = pastedRowCells[i];
                    this.dataGridView1.AutoResizeColumns();

                }
                j++;
            }
        }




     }

那我就是用这个方法把datagridview转成DataTable

        private DataTable GetDataTableFromDGV(DataGridView dgv)
    {
        var dt = new DataTable();
        foreach (DataGridViewColumn column in dgv.Columns)
        {
            if (column.Visible)
            {
                // You could potentially name the column based on the DGV column name (beware of dupes)
                // or assign a type based on the data type of the data bound to this DGV column.
                dt.Columns.Add();
            }
        }

        object[] cellValues = new object[dgv.Columns.Count];
        foreach (DataGridViewRow row in dgv.Rows)
        {
            for (int i = 0; i < row.Cells.Count; i++)
            {
                cellValues[i] = row.Cells[i].Value;
            }
            dt.Rows.Add(cellValues);
        }

        return dt;
    }

之后使用此 linq 查询获取数据并将其显示到 datagridview2

           DataTable dt = GetDataTableFromDGV(dataGridView1);

        //foreach (DataColumn c in dt.Columns)
        //{
        //    MessageBox.Show(c.ColumnName);
        //}

        var groupedData = from b in dt.AsEnumerable()
                          group b by b.Field<int>("Column2") into g
                          select new
                          {
                              column2 = g.Key,
                              column13 = g.Sum(x => x.Field<decimal>("Column13"))
                          };

        foreach (var result in groupedData)
        {
            dataGridView2.Rows.Add(result);
        }

它抛出“指定的强制转换无效。”

基本上我想要的是如下图所示:

pic

【问题讨论】:

  • 在哪一行抛出异常?
  • dt.AsEnumerable() 自己尝试以下操作 var someValue = Convert.ToDecimal(dt.AsEnumerable().Sum(x =&gt; Convert.ToDecimal(x["Column13"])))

标签: c# datatable


【解决方案1】:

您永远不会为您显示的任何 DataColumn 分配类型,因此它们将具有默认数据类型 string,并且调用 Field&lt;int&gt;Field&lt;decimal&gt; 将引发无效转换异常。

要么在创建数据表时给列分配合适的类型,要么解析字符串值:

    var groupedData = from b in dt.AsEnumerable()
                      group b by int.Parse(b.Field<string>("Column2")) into g
                      select new
                      {
                          column2 = g.Key,
                          column13 = g.Sum(x => decimal.Parse(x.Field<string>("Column13")))
                      };

【讨论】:

    猜你喜欢
    • 2013-04-01
    • 2013-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-16
    • 1970-01-01
    相关资源
    最近更新 更多