VBレスキュー(花ちゃん)
VB2005用トップページへVBレスキュー(花ちゃん)のトップページVB6.0用のトップページ各掲示板

メニューへ戻ります。 DataGridView 関係のメニュー
1.DataGridView でのデータの読込・保存・表示関係
2.DataGridView でのヘッダー関係の設定色々
3.DataGridView でのセルに関する操作関係色々 
4.DataGridView での行に関する操作関係色々 
5.DataGridView での列に関する操作関係色々 
6.DataGridView でのソート等のデータ操作関係色々
7.DataGridView で上記以外の設定色々
8. 
9. 
10. 
11.
12.
 . 
20.その他、当サイト内に掲載のDataGridView に関するサンプル 


4.DataGridView での行に関する操作関係色々(18_DGV_04) (旧、SampleNo.309)
1.最下部の新しい行を表示/非表示に設定 及び 新しいレコードの行インデックスを取得
2.新たに追加した行(空行)を調べる方法色々及び行の挿入
3.AllowUserToAddRows = True 時に最下部に新しい行を追加(挿入)及び追加書き込み
4.DataGridView の行の背景色を1行おきに設定
5.DataGridView の行の高さに関する設定色々
6.DataGridView の選択位置に行を挿入する(3方法)
7.DataGridView の行の削除色々
8.指定行を選択する(5行目を選択する)
9.セルの選択を行単位でする/セル単位でする
10.複数選択されている行インデックスを取得・表示
11.DataGridView の指定行が画面上に表示されているどうかを調査する
12.DataGridView の指定行を画面上の Top 位置に表示する
13.DataGridView の指定の行を編集不可(読み取り専用)に設定
14.DataGridView の指定行を非表示に設定する
15.DataGridView の指定の行のみに罫線を描画する
16.DataGridView の指定の行目までをスクロールされないように設定
17.
18.

 下記プログラムコードに関する補足・注意事項 
動作確認:Windows 8.1 (Windows 7) / VB2013 (VB2010) / Framework 4.5.1 / 対象の CPU:x86
Option :[Compare Text] [Explicit On] [Infer On] [Strict On]
Imports :追加なし
参照設定:
WaitTime.dll   参照設定方法参照
その他 :使用データは、次よりダウンロードして使って下さい。 dgvdat.zip
    :このサンプルを使用される前に、左のメニューのDataGridViewでのデータの読込保存関係をご覧になって下さい。
このサンプル等の内容を無断で転載、掲載、配布する事はお断りします。(私の修正・改訂・削除等が及ばなくなるので)
必要ならリンクをはるようにして下さい。(引用の場合は引用元のリンクを明記して下さい)
このページのトップへ移動します。 1.最下部の新しい行を表示/非表示に設定 及び 新しいレコードの行インデックスを取得

Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
'01.最下部の新しい行を表示/非表示に設定 及び 新しいレコードの行インデックスを取得
    If DataGridView1.Rows.Count = 0 Then
        Button1.PerformClick()
    End If

'新しいレコードの行インデックスを取得
'AllowUserToAddRows が false の場合は -1 になります。
'AllowUserToAddRows が false ではない限り、このプロパティの値は、
'コントロールの行数から 1 を引いた値と等しくなります。

    '最下部の新しい行(追加オプション)を表示にする
    DataGridView1.AllowUserToAddRows = True
    Debug.WriteLine(DataGridView1.AllowUserToAddRows.ToString)      '結果 True

    Debug.WriteLine(DataGridView1.NewRowIndex.ToString)             '結果 10(新しい行は、10行にあります。)
    Debug.WriteLine(DataGridView1.RowCount.ToString)                '結果 11

    '最下部の新しい行(追加オプション)を非表示にする
    DataGridView1.AllowUserToAddRows = False
    Debug.WriteLine(DataGridView1.AllowUserToAddRows.ToString)      '結果 False

    Debug.WriteLine(DataGridView1.NewRowIndex.ToString)             '結果 -1(新しい行は、ありません。)
    Debug.WriteLine(DataGridView1.RowCount.ToString)                '結果 10
End Sub

このページのトップへ移動します。 2.行の挿入及び新たに追加した行(空行)を調べる方法色々

Private frg02 As Boolean

Private
Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
'02.新たに追加した行(空行)を調べる方法色々及び行の挿入
    frg02 = Not frg02
    If frg02 Then
        Button1.PerformClick()
        'CSVファイルの読み込み表示(1)で表示した場合の行の挿入
        Dim tb As DataTable = DirectCast(DataGridView1.DataSource, DataTable)
        tb.Rows.InsertAt(tb.NewRow, 4)

    Else
        DGVClear(DataGridView1)                             '初期化のSub プロシージャを Call
        DataGridView1.RowTemplate.Height = 60
        Button2.PerformClick()

        'CSVファイルの読込表示(非結合)で表示した場合の行の挿入
        DataGridView1.Rows.Insert(4, 1)
    End If

'新たに追加した行(空行)を調べる(表示方法により違いがあるので注意)

    For i As Integer = 0 To DataGridView1.Rows.Count - 1

        'これでは上記の追加行は検出できない。
        If DataGridView1.Rows(i).IsNewRow Then
            MessageBox.Show(i + 1 & " 行目は、IsNewRow です。(1)")  '12 行目のみ
        End If

        'こちらは検出できるが、最下行は、検出できない
        If IsDBNull(DataGridView1.Item(0, i).Value) Then
            MessageBox.Show(i + 1 & " 行目は、IsDBNull です。(2)")  '5 行目のみ
        End If

        'この表示の場合、最下行しか検出できない
        Dim testVar As Object = DataGridView1.Item(0, i).Value
        If IsNothing(testVar) Then
            MessageBox.Show(i + 1 & " 行目は、Nothing です。(3)")   '12 行目のみ
        End If

        If IsDBNull(DataGridView1.Item(0, i).Value) Or IsNothing(DataGridView1.Item(0, i).Value) Then
            MessageBox.Show(i + 1 & " 行目は、DBNull 又は Nothing です。(4)")  '両方検出できる
        End If

        Try
            'この場合追加行は、エラーになるので注意
            If Len(DataGridView1.Item(0, i).Value) = 0 Then
                MessageBox.Show(i + 1 & " 行目は、Len=0 です。(5)")  '12 行目のみ
            End If
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    Next i

End Sub


このページのトップへ移動します。 3.AllowUserToAddRows = True 時に最下部に新しい行を追加(挿入)及び追加書き込み

Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
'03.AllowUserToAddRows = True 時に最下部に新しい行を追加(挿入)及び追加書き込み
    Button1.PerformClick()

    '新規行の下には行を追加できないので、事前に追加する。
    Dim tb As DataTable = DirectCast(DataGridView1.DataSource, DataTable)
    tb.Rows.InsertAt(tb.NewRow, DataGridView1.RowCount - 1)
    DataGridView1.Item(1, DataGridView1.RowCount - 2).Value = "あいうえお"

    'これだけでは、行が追加されない。(キーダウンイベントを発生させないと追加できない)
    '(手動の場合は、書き込んだら自動的に行が追加されるが...。)
    DataGridView1.Item(1, DataGridView1.RowCount - 1).Value = "かきくけこ"
End Sub

このページのトップへ移動します。 4.DataGridView の行の背景色を1行おきに設定

Private Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.Click
'04.DataGridView の行の背景色を1行おきに設定
    If DataGridView1.Rows.Count = 0 Then
        Button1.PerformClick()
    End If

    If DataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.Empty Then
        '1行おきに背景色を Yellow に設定
        DataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.Yellow
    Else
        '再度クリックで元の色に戻す
        DataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.Empty
    End If
End Sub

 図1.上記実行結果
 datagridview04_1

このページのトップへ移動します。 5.DataGridView の行の高さに関する設定色々

Private Sub Button7_Click(sender As Object, e As EventArgs) Handles Button7.Click
'05.DataGridView の行の高さに関する設定色々
    DGVClear(DataGridView1)                             '初期化のSub プロシージャを Call

'全ての行の高さを指定の高さに設定(表示前に設定するなら)
    DataGridView1.RowTemplate.Height = 60
    Button2.PerformClick()

    wt.WaitTime(3000)
    Beep()

'全ての行の高さを指定の高さに設定(表示後に設定するなら)
    For Each row As DataGridViewRow In DataGridView1.Rows
        row.Height = 30
    Next
    wt.WaitTime(3000)
    Beep()

'指定行だけなら
    DataGridView1.Rows(5).Height = 60
    wt.WaitTime(3000)
    Beep()

'行の高さが、ヘッダーセルを除く行内のすべてのセルの内容に合わせて調節されます
    DataGridView1.AutoResizeRows(DataGridViewAutoSizeRowsMode.AllCellsExceptHeaders)
    wt.WaitTime(3000)
    Beep()

'全ての行の高さを行内のすべてのセルの内容に合わせて調節
    DataGridView1.AutoResizeRows()
    wt.WaitTime(3000)
    Beep()

'ユーザーが行の高さを変更できないように設定(再度クリックすると変更可に)
    DataGridView1.AllowUserToResizeRows = (Not DataGridView1.AllowUserToResizeRows)

End Sub


このページのトップへ移動します。 6.DataGridView の選択位置に行を挿入する(3方法)
DataGridViewにデータを読み込んで表示した方法により、行の挿入方法が違ってきますので、読み込み表示方法に合せてください。

Private Sub Button8_Click(sender As Object, e As EventArgs) Handles Button8.Click
'06.DataGridView の選択位置に行を挿入する(3方法)
    If DataGridView1.Rows.Count = 0 Then
        MessageBox.Show("Button1 or Button2 をクリック後行を選択してから実行して下さい")
        Exit Sub
    End If

Try
    '選択位置に行を挿入(その1) (非結合/MDBファイル)の場合は、NG
    Dim tb As DataTable = DirectCast(DataGridView1.DataSource, DataTable)
    tb.Rows.InsertAt(tb.NewRow, DataGridView1.CurrentCell.RowIndex)
    MessageBox.Show("1.の方法で挿入しました")
Catch ex As Exception
    MessageBox.Show(ex.Message)
End Try

Try
    '場合により(その2) mdbファイルをADO.NETを使ってDataGridViewに表示の場合等
    Dim ds As DataSet = DirectCast(DataGridView1.DataSource, DataSet)
    Dim tb1 As DataTable = ds.Tables(0)
    tb1.Rows.InsertAt(tb1.NewRow, DataGridView1.CurrentCell.RowIndex)
    MessageBox.Show("2.の方法で挿入しました")
Catch ex As Exception
    MessageBox.Show(ex.Message)
End Try

Try
    '選択位置に行を挿入(その3)  非連結で読み込み表示の場合等
    DataGridView1.Rows.Insert(DataGridView1.CurrentCell.RowIndex, 1)
    MessageBox.Show("3.の方法で挿入しました")
Catch ex As Exception
    MessageBox.Show(ex.Message)
End Try

End Sub

このページのトップへ移動します。 7.DataGridView の行の削除色々

Private frgRowRemove As Boolean

Private Sub Button9_Click(sender As Object, e As EventArgs) Handles Button9.Click
'07.DataGridView の行の削除色々
    If DataGridView1.Rows.Count = 0 Then
        Button1.PerformClick()
    End If

    'クリックした行の削除を許可
    frgRowRemove = True

    '選択行を削除する場合
    Dim rowInd As Integer = DataGridView1.CurrentCell.RowIndex
    Dim result As DialogResult
    result = MessageBox.Show(rowInd + 1 & "行目を削除してもよろしいですか?", _
                        "削除確認", MessageBoxButtons.YesNo)
    If result = Windows.Forms.DialogResult.Yes Then
        DataGridView1.Rows.RemoveAt(rowInd)
    End If
    wt.WaitTime(2000)

    '複数選択されている行(1行全体を選択)をすべて削除する場合
    For Each Row As DataGridViewRow In DataGridView1.SelectedRows
        If Not Row.IsNewRow Then
            DataGridView1.Rows.Remove(Row)
        End If
    Next Row
End Sub

Private Sub DataGridView1_MouseClick(sender As Object, e As MouseEventArgs) Handles DataGridView1.MouseClick
    If frgRowRemove Then
        'クリックした行を確認の上削除
        Dim pos As System.Windows.Forms.DataGridView.HitTestInfo = DataGridView1.HitTest(e.X, e.Y)
        If pos.Type = DataGrid.HitTestType.Cell Then
            Dim result As DialogResult
            result = MessageBox.Show(pos.RowIndex + 1 & "行目を削除してもよろしいですか?", _
                                "削除確認", MessageBoxButtons.YesNo)
            If result = Windows.Forms.DialogResult.Yes Then
                DataGridView1.Rows.RemoveAt(pos.RowIndex)
                'DataGridView1.Rows.Remove(DataGridView1.Rows(pos.RowIndex)) 'こちらでも可
            End If
        End If
        frgRowRemove = False
    End If
End Sub

このページのトップへ移動します。 8.指定行を選択する(5行目を選択する)

Private Sub Button10_Click(sender As Object, e As EventArgs) Handles Button10.Click
'08.指定行を選択する(5行目を選択する)
    If DataGridView1.Rows.Count = 0 Then
        Button1.PerformClick()
    End If
    '初期表示時に選択されているセルをなくす(必要な個所で下記コードを実行)
    DataGridView1.CurrentCell = Nothing

    '5行目を選択する
    DataGridView1.Rows(4).Selected = True
End Sub

このページのトップへ移動します。 9.セルの選択を行単位でする/セル単位でする

Private Sub Button11_Click(sender As Object, e As EventArgs) Handles Button11.Click
'09.セルの選択を行単位でする/セル単位でする
    If DataGridView1.Rows.Count = 0 Then
        Button1.PerformClick()
    End If

    If DataGridView1.SelectionMode = DataGridViewSelectionMode.CellSelect Then
        'セルの選択を行単位でする()
        DataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect
    Else
        'セルの選択をセル単位でする
        DataGridView1.SelectionMode = DataGridViewSelectionMode.CellSelect
    End If
End Sub

このページのトップへ移動します。 10.複数選択されている行インデックスを取得・表示

Private Sub Button12_Click(sender As Object, e As EventArgs) Handles Button12.Click
'10.複数選択されている行インデックスを取得・表示
    If DataGridView1.Rows.Count = 0 Then
        Button1.PerformClick()
    End If

    '選択されている行数を取得
    Dim Sdat As DataGridViewSelectedRowCollection = DataGridView1.SelectedRows
    '選択されていない場合処理しない
    If Sdat.Count < 1 Then
        System.Media.SystemSounds.Beep.Play()
        Exit Sub
    End If
    '先入れ後だしなので、選択した順番に取りだし
    For i As Integer = Sdat.Count - 1 To 0 Step -1
        Dim MyText As String = ""
        If Me.DataGridView1.Item(0, Sdat(i).Index).Value IsNot Nothing Then
            MyText = Me.DataGridView1.Item(0, Sdat(i).Index).Value.ToString
            Debug.Print(Sdat(i).Index.ToString & " MyText : " & MyText)
        End If
    Next

    '複数選択されている行を取得・表示
    'こちらは、後入れ先出しになる
    For Each Row As DataGridViewRow In DataGridView1.SelectedRows
        Debug.Print(String.Format("RowIndex = {0}", Row.Index))
    Next Row
End Sub

このページのトップへ移動します。 11.DataGridView の指定行が画面上に表示されているどうかを調査する

Private Sub Button13_Click(sender As Object, e As EventArgs) Handles Button13.Click
'11.DataGridView の指定行が画面上に表示されているどうかを調査する
    Button1.PerformClick()
    For Each row As DataGridViewRow In DataGridView1.Rows
        row.Height = 100
    Next
    Me.Height = 200

    If DataGridView1.Rows(7).Displayed = False Then
        MessageBox.Show("8行目は表示されていません")
    End If
End Sub


このページのトップへ移動します。 12.DataGridView の指定行を画面上の Top 位置に表示する

Private Sub Button14_Click(sender As Object, e As EventArgs) Handles Button14.Click
'12.DataGridView の指定行を画面上の Top 位置に表示する
    If DataGridView1.Rows.Count = 0 Then
        Button1.PerformClick()
    End If
    Button1.PerformClick()
    For Each row As DataGridViewRow In DataGridView1.Rows
        row.Height = 100
    Next
    Me.Height = 200

    '指定行をTopに表示する
    DataGridView1.FirstDisplayedScrollingRowIndex = 6

    '最下行までスクロールさせる場合
    'DataGridView1.FirstDisplayedScrollingRowIndex = DataGridView1.Rows.Count - 1
End Sub

このページのトップへ移動します。 13.DataGridView の指定の行を編集不可(読み取り専用)に設定

Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click
'13.DataGridView の指定の行を編集不可(読み取り専用)に設定
    If DataGridView1.Rows.Count = 0 Then
        Button1.PerformClick()
    End If

    '5行目(鈴木一郎)を編集不可に設定
    'DataGridView1.Rows(4).ReadOnly = True

    '上記編集不可の設定を元に戻す
    'DataGridView1.Rows(4).ReadOnly = False

    DataGridView1.Rows(4).ReadOnly = Not DataGridView1.Rows(4).ReadOnly

End Sub

このページのトップへ移動します。 14.DataGridView の指定行を非表示に設定する

Private Sub Button16_Click(sender As Object, e As EventArgs) Handles Button16.Click
'14.DataGridView の指定行を非表示に設定する
    If DataGridView1.Rows.Count = 0 Then
        Button1.PerformClick()
    End If

    'DataGridView1.Rows(1).Visible = False
    ''元に戻す場合
    'DataGridView1.Rows(1).Visible = True

    DataGridView1.Rows(1).Visible = Not DataGridView1.Rows(1).Visible

End Sub

このページのトップへ移動します。 15.DataGridView の指定の行のみに罫線を描画する

Private Sub Button17_Click(sender As Object, e As EventArgs) Handles Button17.Click
'15.DataGridView の指定の行のみに罫線を描画する
    frgRowDrawRectangle = Not frgRowDrawRectangle
    Button1.PerformClick()
End Sub

Private frgRowDrawRectangle As Boolean

Private Sub DataGridView1_CellPainting(sender As Object, _
           e
As DataGridViewCellPaintingEventArgs) Handles DataGridView1.CellPainting
'指定の行のみに罫線を描画する(行ヘッダー部分は除く)
    If frgRowDrawRectangle = True AndAlso e.ColumnIndex >= 0 AndAlso (e.RowIndex = 2 Or e.RowIndex = 5) Then
        Dim flgStyle As TextFormatFlags
        '描画する範囲を設定(下側の線が細くなるので描画位置を Height - 1)
        Dim newRect As New Rectangle(e.CellBounds.X, e.CellBounds.Y, _
                e.CellBounds.Width, e.CellBounds.Height - 1)
        'セルの内部を塗りつぶしす
        e.Graphics.FillRectangle(New SolidBrush(e.CellStyle.BackColor), e.CellBounds)
        'セルを描画する(線の太さを2ピクセルで)
        e.Graphics.DrawRectangle(New Pen(New SolidBrush(Color.Red), 2), newRect)
        If (e.Value IsNot Nothing) Then
            'セルデータの表示位置を列個別に設定
            Select Case e.ColumnIndex
                Case 2, 3, 4, 5
                    flgStyle = TextFormatFlags.VerticalCenter Or TextFormatFlags.Right
                Case 0, 1
                    flgStyle = TextFormatFlags.VerticalCenter Or TextFormatFlags.Left
                End Select
                    TextRenderer.DrawText(e.Graphics, CStr(e.Value), _
                            e.CellStyle.Font, e.CellBounds, e.CellStyle.ForeColor, flgStyle)
        End If
        '処理の完了を通知
        e.Handled = True
    End If
End Sub

 図2.上記実行結果
 datagridview04_2

このページのトップへ移動します。 16.DataGridView の指定の行目までをスクロールされないように設定

Private Sub Button18_Click(sender As Object, e As EventArgs) Handles Button18.Click
'16.DataGridView の指定の行目までをスクロールされないように設定
    If DataGridView1.Rows.Count = 0 Then
        Button1.PerformClick()
    End If

    For Each row As DataGridViewRow In DataGridView1.Rows
        row.Height = 100
    Next

    '指定の行目までをスクロールされないように設定
    DataGridView1.Rows(2).Frozen = True

    'これで元に戻りそうに思うのだが、実際には元に戻らない
    DataGridView1.Rows(2).Frozen = False

    'こちらでないと元に戻らない
    'DataGridView1.Rows(0).Frozen = False
End Sub

このページのトップへ移動します。 17. 



このページのトップへ移動します。 18.


このページのトップへ移動します。 検索キーワード及びサンプルコードの別名(機能名)
新しいレコードの行インデックスを取得 新たに追加した行(空行)を調べる 1行おきに背景色を設定 行のサイズ変更(高さ)を不可に設定 行の高さを自動調整 クリックした行を確認の上削除 選択行を選択順に取得・他 最下部の新しい行を非表示に設定 最下部の新しい行に書き込み追加 指定行を画面のTopに表示する 指定行が画面上に表示されているか 全ての行の高さを指定の高さに設定 セルの選択を行単位でする 選択位置に行を挿入 選択されている行をすべて削除する 指定行(Rows(1))を非表示に設定 指定行(6行目)を選択する 指定の行のみに罫線を描画する 最下行までスクロールさせる 指定の行目までをスクロールされないように設定


このページのトップへ移動します。