【解決方法】 System.argumentoutofrangeException: ‘インデックスが範囲外でした。 負ではなく、コレクションのサイズより小さくなければなりません。 パラメータ名: インデックス’

プログラミングQA


private void ItemGV_CellClick(object sender, DataGridViewCellEventArgs e)
       {
           if (e.RowIndex >= 0)
           {
               txtItemnum.Text = ItemGV.SelectedRows[0].Cells[0].Value.ToString();
               txtItemname.Text = ItemGV.SelectedRows[0].Cells[1].Value.ToString();
               comboCat.SelectedItem = ItemGV.SelectedRows[0].Cells[2].Value.ToString();
               txtitemprice.Text = ItemGV.SelectedRows[0].Cells[3].Value.ToString();
               //txtemail.Text = UserGV.SelectedRows[0].Cells[4].Value.ToString();
           }

私が試したこと:

クリックイベントでグリッド値をテキストボックスに取得するコードを書いています

解決策 1

「あるよ!」とは言えません。 正確にどこで問題が発生しているのか、どの値が問題の原因となっているのかを調べるには、データを使用してコードを実行する必要があるため、調査を開始する前にそれが必要になるからです。 なぜ それは間違っています!

私たちにできることは、なぜそれが問題を引き起こしているのかを説明することだけです。 C# の配列は、インデックスを介してアクセスされる値のシーケンスです。そのインデックスは、0 から「値の数から 1 を引いた値」までの間でなければなりません。 したがって、たとえば 5 つの整数を含む配列がある場合、有効なインデックスは 0、1、2、3、および 4 です。処理しようとしている値が存在しないため、他のすべてのインデックスではエラーが発生します。
したがって、次のように言うことができます。

C#
i = arr[0];
i = arr[1];
i = arr[2];
i = arr[3];
i = arr[4];

だがしかし:

C#
i = arr[-1];
i = arr[5];
i = arr[666];

また、コードでは複数の配列が使用されており、そのいずれかが問題の原因である可能性があります。

それはあなた次第です。
幸いなことに、何が起こっているかを調べるのに役立つツール、デバッガーが利用可能です。 使い方がわからない場合は、Google で「Visual Studio デバッガー」と検索すると、必要な情報が得られます。

関数の最初の行にブレークポイントを設定し、デバッガーでコードを実行します。 次に、コードとデータを調べて、手動で何が起こるかを考えます。 次に、各行を 1 ステップずつ実行して、期待したことが実際に起こったかどうかを確認します。 そうでない場合は、問題が発生しているときなので、前に戻って (またはもう一度実行して詳しく調べて) 理由を調べることができます。

推測では、SelectedItems コレクションが空であるか、グリッド内に十分な列がありませんが、それを判断するにはデータを使用してコードを実行する必要があります。

申し訳ありませんが、私たちはそれを行うことはできません。新しい (そして非常に便利な) スキルであるデバッグを学ぶ時期です。

コメント

タイトルとURLをコピーしました