-1

我有一个试图转换为 DataTable 的 GridView。我不能为此 DataTable 使用 GridView 的 DataSource。我发现下面的方法是最常用的解决此任务的方法,但由于某种原因,下面的方法不断抛出“找不到第 0 列”的 IndexOutOfRangeException。这是代码:

    DataSet ds = new DataSet("Student");
    DataTable dt = new DataTable(String.Format("{0}For{1}", gv.ID.Substring(2, gv.ID.Length - 2), year));
    for (int j = 0; j < gv.Rows.Count; j++)
    {
        DataRow dr;
        GridViewRow row = gv.Rows[j];
        dr = dt.NewRow();
        for (int i = 0; i < row.Cells.Count; i++)
        {
            dr[i] = row.Cells[i].Text; //***EXCEPTION IS THROWN HERE***
        }
        dt.Rows.Add(dr);
    }
    ds.Tables.Add(dt);

每行有 18 个单元格。

提前感谢您的帮助。

解决方案 我接受了 CptSupermrkt 的建议,并在第一个“for”循环之前实现了这段代码,并且该方法继续运行,没有抛出异常:

    DataColumn dc;
    foreach (var item in gv.Columns)
    {
        dc = new DataColumn(item.ToString());
        dt.Columns.Add(dc);
    }
4

2 回答 2

1

您定义的 DataTable 也没有定义任何列,因此您从 dt.NewRow() 获得的行没有列。因此试图访问列的索引是行不通的。

我认为您需要创建的 DataTable 具有与 GridView 相同的列。

DataTable dt = new DataTable(String.Format("{0}For{1}", gv.ID.Substring(2, gv.ID.Length - 2), year));

DataColumn idCol = new DataColumn("ID");
DataColumn nameCol = new DataColumn("Name");
//etc.

dt.Columns.Add(idCol);
dt.Columns.Add(nameCol);
//etc.

然后,当您在 DataTable 上创建 use NewRow() 时,该行将包含列,您可以在尝试在其余代码中进行操作时访问它们。

于 2012-10-05T02:43:38.637 回答
0

看起来这是导致问题的 dr[i] 。新创建的 DataRow dr 没有第 0 列。

于 2012-10-05T02:39:16.803 回答