none
DataGridView にて 列ヘッダーをクリック(選択)できない またはクリック(選択)を無効にしたい。 RRS feed

  • 質問

  • いつもおせわになっております。
    次のようなプログラムにより、DataGridViewの行が選択されると
    各セルの内容がテキストボックス等に反映されるようにしてあります。

    Private Sub DataGridView1_CellClick _
     (ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs)  _
     Handles DataGridView1.CellClick

        chkONOFF.Checked = DataGridView1(0, e.RowIndex).Value
        txtUserID.Text = DataGridView1(1, e.RowIndex).Value
        txtUserName.Text = DataGridView1(2, e.RowIndex).Value
        cmbUserLevel.SelectedIndex = DataGridView1(4, e.RowIndex).Value - 1

    End Sub

    この場合、DataGridView1 の列ヘッダがクリックされてしまいますと、

    インデックスが範囲を超えています。負でない値で、コレクションのサイズよりも
    小さくなければなりません。 パラメータ名: index

    とエラーが発生し怒られてしまいます。
    列ヘッダーは各項目の内容をわかりやすくするため表示していたいのですが、
    この列ヘッダーをクリック(選択)できなくするにはいかがすればよろしいのでしょうか?

    ご教示の程、よろしくお願い申し上げます。

    なお、DataGridView1 の MultiSelect は False にしてありますし、
    SelectionMode も FullRowSelect にしてあります。

    2010年12月21日 17:08

回答

  • e.RowIndex の値が 0 以上かどうかを判断してはいかがでしょうか。
    列ヘッダーの場合だと e.RowIndex は -1 になっていると思います。
    • 回答としてマーク kei_chan_gt 2010年12月22日 3:48
    2010年12月21日 18:27
  • 列ヘッダーのクリックはソートにも使用されますので、通常はtotojoさんが書かれているようにe.RowIndex が-1より大きいかどうかで判断することで十分だと思います。
    ただ、要望によってはクリックそのものを不可能にしたいということがあるかもしれません。その時には透明なパネルなどで覆ってください。DataGridViewをReadOnlyにしてもいじれてしまいますので、いじることもできないようにしたい場合にも使えます。
    泥臭いようですが、この覆ってしまうという方法も頭の隅に入れておけば、役に立つことがあるかもしれません。

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク kei_chan_gt 2010年12月22日 3:48
    2010年12月22日 0:56
    モデレータ

すべての返信

  • e.RowIndex の値が 0 以上かどうかを判断してはいかがでしょうか。
    列ヘッダーの場合だと e.RowIndex は -1 になっていると思います。
    • 回答としてマーク kei_chan_gt 2010年12月22日 3:48
    2010年12月21日 18:27
  • 列ヘッダーのクリックはソートにも使用されますので、通常はtotojoさんが書かれているようにe.RowIndex が-1より大きいかどうかで判断することで十分だと思います。
    ただ、要望によってはクリックそのものを不可能にしたいということがあるかもしれません。その時には透明なパネルなどで覆ってください。DataGridViewをReadOnlyにしてもいじれてしまいますので、いじることもできないようにしたい場合にも使えます。
    泥臭いようですが、この覆ってしまうという方法も頭の隅に入れておけば、役に立つことがあるかもしれません。

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク kei_chan_gt 2010年12月22日 3:48
    2010年12月22日 0:56
    モデレータ
  • totojo さま
    trapemiya さま

    ありがとうございます。

    If e.RowIndex >= 0 Then

      ~処理~

    End If

    で無事、要件を満たすことができました<(_)>

    また裏ワザもご伝授いただきありがとうございます。
    DataGridView の Enable を False にして
    似たようなことを実現するようにしておりましたが
    trapemiya さまのご教示のほうが簡単そうです。
    ありがとうございました。

    2010年12月22日 3:48