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

1 行あたり 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() から取得した行には列がありません。したがって、列のインデックスにアクセスしようとしても機能しません。

GridView と同じ列を作成するには、作成している DataTable が必要だと思います。

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 に答える