3

エラーは次のとおりです。インデックスが範囲外でした。負ではなく、コレクションのサイズよりも小さい必要があります。

シナリオ:XMLファイルをロードしてデータをグリッドに表示するデスクトップアプリケーションがあります。次に、別のファイルを挿入し、両方のファイルにデータを追加します。しかし、データをマージしようとすると(つまり、以前に開いたファイルの行があるDataTableに行を追加することを意味します)...このエラーが発生します。

if (strPreviousFile != "")   
{  
  dgvBooksDetails.DataSource = dtBooks;   
  int intCurrentRows = dgvBooksDetails.Rows.Count;   
  intBooksCounter = intBooksCounter + intCurrentRows;   
  for (int c = intCurrentRows; c < intBooksCounter; c++)  
  {   
    Book objBook = new Book();   
    objBook.ID = BookID[c];   
    objBook.Title = BookTitle[c];  
    objBook.Author = BookAuthor[c];  
    objBook.Genre = BookGenre[c];  
    objBook.Price = Double.Parse(BookPrice[c]);  
    objBook.PublishDate = DateTime.Parse(BookPublish_Date[c]);  
    objBook.Description = BookDescription[c];  
    dtBooks.Rows.Add(objBook.ID, objBook.Title, objBook.Author, objBook.Genre,
                     objBook.Price, objBook.PublishDate, objBook.Description);   
  }
}

このエラーをどのように克服できますか?

4

3 に答える 3

2

問題を引き起こしている行は次のとおりです。

int intCurrentRows = dgvBooksDetails.Rows.Count;

この値をループの開始として使用します。ただし、行コレクションは 0 から までカウントされるCount-1ため、 を使用Countして行コレクションの値にアクセスすると、インデックス範囲外エラーが発生します。

別のこと:BookTitleなどBookAuthorも 0 からCount-1(またはLength-1配列の場合) にインデックス付けされます。あなたが私たちに言ったことからはわかりませんが、これらのコレクションがあなたのやり方でインデックスによってアクセスできると確信していますか? number of existing itemsつまり、追加する項目のみが含まれているため、 toではなく 0 から X にインデックスを付ける必要があるnumber of existing items + number of new itemsのではないでしょうか (それがコードで行うことです)。

于 2012-07-16T10:54:39.980 に答える
0

nの長さの配列があり、その中のn番目以上の要素にアクセスしようとしているようです。インデックスは0ベースであるため、nサイズの配列にはインデックス0からn-1でアクセスする必要があります。

于 2012-07-16T10:51:39.620 に答える
0

BookTitle配列 ( 、BookAuthorBookGenreBookPriceBookPublish_DateおよびBookDescription) が正しい長さ (最小 intBooksCounter)であることを確認してください。

于 2012-07-16T10:57:24.513 に答える