3

DataGridView を使用して、SQLite データベースからデータを表示しています。1 つの列は、行に割り当てられた PDF を開くためのディレクトリです。コードは機能しますが、列のタイトルをクリックするたびにエラーが表示されます。

インデックスが範囲外でした。負ではなく、コレクションのサイズより小さくなければなりません。

実際、列のテキスト (単に「PDF」または他の列のテキスト) をクリックするたびに、そのエラーがスローされます。しかし、テキストの外側 (順序ボックス内の任意の場所) をクリックすると、列が並べ替えられますが、これは問題ありません。何か案は?

コードは機能し、PDF を開きますが、ユーザーが誤ってタイトル テキストをクリックしてプログラムがクラッシュすることは望ましくありません。これは、pdfを開くためのdatagridviewのコードです。

  private void dataGridView1_CellContentClick_1(object sender, DataGridViewCellEventArgs e)
    {
        string filename = dataGridView1[e.ColumnIndex, e.RowIndex].Value.ToString();
        if (e.ColumnIndex == 3 && File.Exists(filename))
        {
            Process.Start(filename);
        } 
   }

ここに画像の説明を入力

4

1 に答える 1

7

RowIndexがであるため、ヘッダーをクリックすると例外が発生します-1。とにかくヘッダーをクリックしても何も起こらないようにしたいので、その値を確認して無視することができます。

private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
    if (e.RowIndex == -1 || e.ColumnIndex != 3)  // ignore header row and any column
        return;                                  //  that doesn't have a file name

    var filename = dataGridView1.CurrentCell.Value.ToString();

    if (File.Exists(filename))
        Process.Start(filename);
}

また、FWIW、サブスクライブしているため、ヘッダーのテキストをクリックしたときにのみ例外が発生しますCellContentClick(テキストなどのセルのコンテンツをクリックしたときにのみ発生します)。イベントを使用することをお勧めしCellClickます (セルの任意の部分がクリックされると発生します)。

于 2014-10-09T14:29:35.550 に答える