linq施法错误

时间:2016-02-04 19:35:01

标签: c# datatable

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

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

 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
    response.getWriter().append("Served at: ").append(request.getContextPath());
    PrintWriter out =response.getWriter();

    Cookie[] cookies=request.getCookies();

    for(Cookie ck: cookies){
        out.println(ck.getName());
        out.println(ck.getValue());
    }
}

然后我使用此方法将datagridview转换为DataTable

        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++;
            }
        }




     }

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

        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;
    }
它抛出一个&#34;指定演员表无效。&#34;

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

pic

1 个答案:

答案 0 :(得分:0)

您永远不会将类型分配给您显示的任何DataColumns,因此它们的默认数据类型为string,调用Field<int>Field<decimal>会导致无效的投射例外。

在创建数据表时分配适当的类型或解析字符串值:

    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")))
                      };