目次 †
個人的によく使うプロパティ †
- 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に反映させる。