このページをはてなブックマークに追加このページを含むはてなブックマーク このページをlivedoor クリップに追加このページを含むlivedoor クリップ

目次

個人的によく使うプロパティ

  • AllowUserToAddRows = False
    • *を消す
  • ReadOnly = True
    • 編集不可
  • RowHeaderVisible = False
    • 一番左の列(選択している行に矢印を表示する列)を消す。
  • SelectionMode = FullRowSelect
    • 行全体選択(反転)
  • MultiSelect = False
    • 複数選択不可

DataGridView vs. ListView

 ListViewと比べてDataGridViewが有利な点を挙げる。

  • プルダウンメニューのセルが作れる。
  • ボタンのセルが作れる。
  • ハイパーリンクのセルが作れる。
    • ListViewの場合、HotTrackingプロパティでアイテム上にマウスポインタが来るとその行全体をハイパーリンク状態に見せかけることはできる。
  • 任意の列を不可視にできる。
    • ListViewでは表示列の後ろにデータを追加しておくことで、不可視のデータを複数持てる。しかし、任意の列で不可視データを持てないので、それを実現したければDataGridViewにするかListViewを継承した自作コントロールを使う必要がある。
  • セルが編集可能。DBのデータ入力などに向いている。
  • 最後の列をぴったり右枠にあわせることができる。
    • ListViewの場合、手動で右枠に合わせても、レコードが多くて縦スクロールバーが表示されたとき、それと同時に横スクロールバーも表示されてしまう。

 微妙な違いを次に挙げる。

  • 列の仕切りにマウスポインタを持っていったときのマウスカーソルが違う。
  • 列ヘッダの高さが異なる。
  • 列ヘッダ内に表示される列名の位置が異なる。

行を追加する。

  • 列がDataGridViewCheckBoxColumn型ならば、True or False

方法1

DataGridView1.Rows.Add("〜", "〜")

方法2

DataGridView1.Rows.Add(New [Object]() {"〜", "〜"})

選択行を削除する。

DataGridView1.Rows.RemoveAt(DataGridView1.CurrentCell.RowIndex)

選択した行の特定の列をラベルに表示する

Label1.Text = DataGridView1.CurrentRow.Cells(3).Value.ToString

 CurrentRowは選択している行を意味する。Cells()で指定する数値は列番号である。1列目は列番号0、2列目は列番号1のように、0からカウントすることに注意。そして、Valueで指定したセルの値を取得する。

選択したときに反転していないように見せる

 DefaultCellStyleプロパティで、SelectionBackColorをBackgroundColor、SelectionForeColorをBlackにすると反転していないように見せかけられる。

 ただし、セルの選択時の点線は見える。

指定した列でソートする

DataGridView1.Sort(カラム名, System.ComponentModel.ListSortDirection.Ascending)
DataGridView1.Rows(0).Selected = True

 コード解説は次の通り。

  • 1行目
    • Sort()の第1引数がカラム名、第2引数がソートのモード(昇順)を意味する。
  • 2行目
    • ソートしただけだと選択行が1行目にならないため、強制的にソート後の1行目を選択し直している。

セルフォーカス

dgv.Rows(0).Selected = True      '1行目を行選択する。
dgv.CurrentCell = dgv(1, 0)   '1行目をセルフォーカスする。

ソート禁止

  • DataGridViewはデフォルトで列ヘッダをクリックすると、ソートができる。ソート対象の列ヘッダには三角マーク(並べ替えグリフと呼ぶ)が表示される。
  • 各カラムのSetModeプロパティでソートの可・不可を指定することができる。
  • 並べ替えグリフを表示させないでソートさせたいならば、ソートしたい列のSetModeをProgrammaticにして、コード上でソートすればよい(Programmaticにすると並べ替えグリフが表示されない)。
    • また、可視化された列のSetModeをすべてNotSortableかProgrammaticにしておき、不可視の列を追加し、コード上でその列をソートすればよい。
  • 詳細はMSDNを参照せよ。

DataGridViewにおけるフォーカスのあるセルの点線枠を消去

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
    Private Sub DataGridView1_CellPainting(ByVal sender As System.Object, _
                                    ByVal e As System.Windows.Forms.DataGridViewCellPaintingEventArgs) _
                                    Handles DataGridView1
        'ヘッダー以外のとき
        If e.ColumnIndex >= 0 And e.RowIndex >= 0 Then
            'フォーカス枠以外が描画されるようにする
            Dim paintParts As DataGridViewPaintParts = _
                e.PaintParts And Not DataGridViewPaintParts.Focus
            'セルを描画する
            e.Paint(e.ClipBounds, paintParts)
 
            '描画が完了したことを知らせる
            e.Handled = True
        End If
    End Sub

複数の列を組み合わせてソート

アプローチ1

 VisibleプロパティがFalseの列を作り、そこにソート対象の列を連結した文字列などを作る。そして、その列においてソートすればよい。

アプローチ2

 いきなりDataGridViewにデータを格納するのではなく、DataSetオブジェクトを作り、ソート済みのDataViewオブジェクトをDataGridViewに反映させる。