DataGridView控件用法合集


1.當前的單元格屬性取得、變更

Console.WriteLine(DataGridView1.CurrentCell.Value)

Console.WriteLine(DataGridView1.CurrentCell.ColumnIndex)

Console.WriteLine(DataGridView1.CurrentCell.RowIndex)

DataGridView1.CurrentCell = DataGridView1(0, 0)

2.DataGridView編輯屬性

全部單元格編輯屬性

DataGridView1.ReadOnly = True

指定行列單元格編輯屬性

DataGridView1.Columns(1).ReadOnly = True

DataGridView1.Rows(2).ReadOnly = True

DataGridView1(0, 0).ReadOnly = True

根據條件判斷單元格的編輯屬性

下例中column2的值是True的時候,Column1設為可編輯

Private Sub DataGridView1_CellBeginEdit(ByVal sender As Object, _

        ByVal e As DataGridViewCellCancelEventArgs) _

        Handles DataGridView1.CellBeginEdit

    Dim dgv As DataGridView = CType(sender, DataGridView)

       If dgv.Columns(e.ColumnIndex).Name = "Column1" AndAlso _

        Not CBool(dgv("Column2", e.RowIndex).Value) Then

                e.Cancel = True

    End If

End Sub

3.DataGridView最下面一列新追加行非表示

DataGridView1.AllowUserToAddRows = False

4.判斷當前選中行是否為新追加的行

If DataGridView1.CurrentRow.IsNewRow Then

    Console.WriteLine("現在のセルがある行は、新しい行です。")

Else

    Console.WriteLine("現在のセルがある行は、新しい行ではありません。")

End If

5. DataGridView刪除行可否設定

DataGridView1.AllowUserToDeleteRows = False

根據條件判斷當前行是否要刪除

Private Sub DataGridView1_UserDeletingRow(ByVal sender As Object, _

        ByVal e As DataGridViewRowCancelEventArgs) _

        Handles DataGridView1.UserDeletingRow

        If MessageBox.Show("この列を削除しますか?", "削除の確認", _

        MessageBoxButtons.OKCancel, MessageBoxIcon.Question) <> Windows.Forms.DialogResult.OK Then

        e.Cancel = True

    End If

End Sub

6. DataGridView行列不表示和刪除

行列不表示

DataGridView1.Columns(0).Visible = False

DataGridView1.Rows(0).Visible = False

行列表頭部分不表示

DataGridView1.ColumnHeadersVisible = False

DataGridView1.RowHeadersVisible = False

指定行列刪除

DataGridView1.Columns.Remove("Column1")

DataGridView1.Columns.RemoveAt(0)

DataGridView1.Rows.RemoveAt(0)

選擇的行列刪除(多行列)

Dim r As DataGridViewRow

For Each r In DataGridView1.SelectedRows

    If Not r.IsNewRow Then

        DataGridView1.Rows.Remove(r)

    End If

Next r

7. DataGridView行列寬度高度設置為不能編輯

DataGridView1.AllowUserToResizeColumns = False

DataGridView1.AllowUserToResizeRows = False

指定行列寬度高度設置為不能編輯

DataGridView1.Columns(0).Resizable = DataGridViewTriState.False

DataGridView1.Rows(0).Resizable = DataGridViewTriState.False

列幅行高最小值設定

DataGridView1.Columns(0).MinimumWidth = 100

DataGridView1.Rows(0).MinimumHeight = 50

行列表頭部分行高列幅設置為不能編輯

DataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing

DataGridView1.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.EnableResizing

8. DataGridView行高列幅自動調整

DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells

DataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells

表頭部分行高列幅自動調整

DataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize

DataGridView1.RowHeadersWidthSizeMode =  DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders

指定列自動調整

DataGridView1.Columns(0).AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells

9. DataGridView指定行列凍結

列凍結(當前列以及左側做所有列)

DataGridView1.Columns(1).Frozen = True

行凍結(當前行以及上部所有行)

DataGridView1.Rows(2).Frozen = True

指定單元格凍結(單元格所在行上部分所有行,列左側所有列)

DataGridView1(0, 0). Frozen = True

10. DataGridView列順序變更可否設定

DataGridView1.AllowUserToOrderColumns = True

但是如果列凍結的情況下,凍結的部分不能變更到非凍結的部分。
變更后列位置取得

Console.WriteLine(DataGridView1.Columns("Column1").DisplayIndex)

DataGridView1.Columns("Column1").DisplayIndex = 0

11. DataGridView行復數選擇

復數行選擇不可

DataGridView1.MultiSelect = False

單元格選擇的時候默認為選擇整行

DataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect

12. DataGridView選擇的行、列、單元格取得

Console.WriteLine("選択されているセル")

For Each c As DataGridViewCell In DataGridView1.SelectedCells

    Console.WriteLine("{0}, {1}", c.ColumnIndex, c.RowIndex)

Next c

Console.WriteLine("選択されている行")

For Each r As DataGridViewRow In DataGridView1.SelectedRows

    Console.WriteLine(r.Index)

Next r

Console.WriteLine("選択されている列")

For Each c As DataGridViewColumn In DataGridView1.SelectedColumns

    Console.WriteLine(c.Index)

Next c

指定行、列、單元格取得

DataGridView1(0, 0).Selected = True

DataGridView1.Rows(1).Selected = True

DataGridView1.Columns(2).Selected = True

13. DataGridView指定單元格是否表示

If Not DataGridView1(0, 0).Displayed AndAlso _

        DataGridView1(0, 0).Visible Then

    DataGridView1.CurrentCell = DataGridView1(0, 0)

End If

14. DataGridView表頭部單元格取得

DataGridView1.Columns(0).HeaderCell.Value = "はじめの列"

DataGridView1.Rows(0).HeaderCell.Value = "はじめの行"

DataGridView1.TopLeftHeaderCell.Value = "左上"

15. DataGridView表頭部單元格文字列設定

更改列Header表示文字列

DataGridView1.Columns(0).HeaderText = "はじめの列"

更改行Header表示文字列

Dim i As Integer

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

    DataGridView1.Rows(i).HeaderCell.Value = i.ToString()

Next i

DataGridView1.AutoResizeRowHeadersWidth(DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders)

最左上Header單元格文字列

DataGridView1.TopLeftHeaderCell.Value = "/"

16. DataGridView選擇的部分拷貝至剪貼板

拷貝模式設定

DataGridView1.ClipboardCopyMode = DataGridViewClipboardCopyMode.EnableWithoutHeaderText

選中部分拷貝

Clipboard.SetDataObject(DataGridView1.GetClipboardContent())

17.DataGridView粘貼

If DataGridView1.CurrentCell Is Nothing Then

    Return

End If

Dim insertRowIndex As Integer = DataGridView1.CurrentCell.RowIndex

 

Dim pasteText As String = Clipboard.GetText()

If String.IsNullOrEmpty(pasteText) Then

    Return

End If

pasteText = pasteText.Replace(vbCrLf, vbLf)

pasteText = pasteText.Replace(vbCr, vbLf)

pasteText.TrimEnd(New Char() {vbLf})

Dim lines As String() = pasteText.Split(vbLf)

 

Dim isHeader As Boolean = True

For Each line As String In lines

        If isHeader Then

        isHeader = False

    Else

        Dim vals As String() = line.Split(ControlChars.Tab)

        If vals.Length - 1 <> DataGridView1.ColumnCount Then

            Throw New ApplicationException("列數が違います。")

        End If

        Dim row As DataGridViewRow = DataGridView1.Rows(insertRowIndex)

        row.HeaderCell.Value = vals(0)

        Dim i As Integer

        For i = 0 To row.Cells.Count - 1

            row.Cells(i).Value = vals((i + 1))

        Next i

        insertRowIndex += 1

    End If

Next line

18. DataGridView單元格上ToolTip表示設定(鼠標移動到相應單元格上時,彈出說明信息)

DataGridView1(0, 0).ToolTipText = "このセルは変更できません"

DataGridView1.Columns(0).ToolTipText = "この列には數字を入力できます"

DataGridView1.Rows(0).HeaderCell.ToolTipText = "この行のセルは変更できません"

CellToolTipTextNeeded事件,在多個單元格使用相同的ToolTips的時候,可以用該事件,下例為顯示當前單元格的行號和列號

Private Sub DataGridView1_CellToolTipTextNeeded(ByVal sender As Object, _

        ByVal e As DataGridViewCellToolTipTextNeededEventArgs) _

        Handles DataGridView1.CellToolTipTextNeeded

    e.ToolTipText = e.ColumnIndex.ToString() + ", " + e.RowIndex.ToString()

End Sub

19. DataGridView中的ContextMenuStrip屬性

DataGridView1.ContextMenuStrip = Me.ContextMenuStrip1

DataGridView1.Columns(0).ContextMenuStrip = Me.ContextMenuStrip2

DataGridView1.Columns(0).HeaderCell.ContextMenuStrip = Me.ContextMenuStrip2

DataGridView1.Rows(0).ContextMenuStrip = Me.ContextMenuStrip3

DataGridView1(1, 0).ContextMenuStrip = Me.ContextMenuStrip4

也可以用CellContextMenuStripNeeded、RowContextMenuStripNeeded屬性進行定義

Private Sub DataGridView1_CellContextMenuStripNeeded( _

        ByVal sender As Object, _

        ByVal e As DataGridViewCellContextMenuStripNeededEventArgs) _

        Handles DataGridView1.CellContextMenuStripNeeded

    Dim dgv As DataGridView = CType(sender, DataGridView)

    If e.RowIndex < 0 Then

        e.ContextMenuStrip = Me.ContextMenuStrip1

    ElseIf e.ColumnIndex < 0 Then

        e.ContextMenuStrip = Me.ContextMenuStrip2

    ElseIf TypeOf (dgv(e.ColumnIndex, e.RowIndex).Value) Is Integer Then

        e.ContextMenuStrip = Me.ContextMenuStrip3

    End If

End Sub

20.指定DataGridView的滾動框位置

DataGridView1.FirstDisplayedScrollingRowIndex = 0

DataGridView1.FirstDisplayedScrollingColumnIndex = 0

21. DataGridView手動追加列

DataGridView1.AutoGenerateColumns = False

DataGridView1.DataSource = BindingSource1

 

Dim textColumn As New DataGridViewTextBoxColumn()

textColumn.DataPropertyName = "Column1"

textColumn.Name = "Column1"

textColumn.HeaderText = "Column1"

DataGridView1.Columns.Add(textColumn)

22. DataGridView全體分界線樣式設置

DataGridView1.BorderStyle = BorderStyle.Fixed3D

單元格上下左右分界線樣式設置

DataGridView1.AdvancedCellBorderStyle.Top = DataGridViewAdvancedCellBorderStyle.InsetDouble

DataGridView1.AdvancedCellBorderStyle.Right = DataGridViewAdvancedCellBorderStyle.Inset

DataGridView1.AdvancedCellBorderStyle.Bottom = DataGridViewAdvancedCellBorderStyle.Inset

DataGridView1.AdvancedCellBorderStyle.Left = DataGridViewAdvancedCellBorderStyle.InsetDouble

23.根據DataGridView單元格屬性更改顯示內容

如下例,當該列是字符串時,自動轉換文字大小寫

Private Sub DataGridView1_CellFormatting(ByVal sender As Object, _

        ByVal e As DataGridViewCellFormattingEventArgs) _

        Handles DataGridView1.CellFormatting

    Dim dgv As DataGridView = CType(sender, DataGridView)

 

    If dgv.Columns(e.ColumnIndex).Name = "Column1" AndAlso _

            TypeOf e.Value Is String Then

        Dim str As String = e.Value.ToString()

        e.Value = str.ToUpper()

         e.FormattingApplied = True

    End If

End Sub

24. DataGridView新追加行的行高樣式設置

行高設置

DataGridView1.RowTemplate.Height = 50

DataGridView1.RowTemplate.MinimumHeight = 50

樣式設置

DataGridView1.DefaultCellStyle.BackColor = Color.Yellow

25. DataGridView新追加行單元格默認值設置

Private Sub DataGridView1_DefaultValuesNeeded(ByVal sender As Object, _

        ByVal e As DataGridViewRowEventArgs) _

        Handles DataGridView1.DefaultValuesNeeded

    e.Row.Cells("Column1").Value = 0

    e.Row.Cells("Column2").Value = "-"

End Sub

26. DataGridView單元格數據錯誤標簽表示

 

DataGridView1(0, 0).ErrorText = "セルの値を確認してください。"

DataGridView1.Rows(3).ErrorText = "負の値は入力できません。"

在大量單元格需要錯誤提示時,也可以用CellErrorTextNeeded、RowErrorTextNeeded事件

Private Sub DataGridView1_CellErrorTextNeeded(ByVal sender As Object, _

        ByVal e As DataGridViewCellErrorTextNeededEventArgs) _

        Handles DataGridView1.CellErrorTextNeeded

    Dim dgv As DataGridView = CType(sender, DataGridView)

    Dim cellVal As Object = dgv(e.ColumnIndex, e.RowIndex).Value

    If TypeOf cellVal Is Integer AndAlso CInt(cellVal) < 0 Then

        e.ErrorText = "負の整數は入力できません。"

    End If

End Sub

 

Private Sub DataGridView1_RowErrorTextNeeded(ByVal sender As Object, _

        ByVal e As DataGridViewRowErrorTextNeededEventArgs) _

        Handles DataGridView1.RowErrorTextNeeded

    Dim dgv As DataGridView = CType(sender, DataGridView)

    If dgv("Column1", e.RowIndex).Value Is DBNull.Value AndAlso _

        dgv("Column2", e.RowIndex).Value Is DBNull.Value Then

        e.ErrorText = _

            "少なくともColumn1とColumn2のどちらかには値を入力してください。"

    End If

End Sub

27. DataGridView單元格內輸入值正確性判斷

Private Sub DataGridView1_CellValidating(ByVal sender As Object, _

        ByVal e As DataGridViewCellValidatingEventArgs) _

        Handles DataGridView1.CellValidating

    Dim dgv As DataGridView = CType(sender, DataGridView)

 

    If dgv.Columns(e.ColumnIndex).Name = "Column1" AndAlso _

            e.FormattedValue.ToString() = "" Then

        dgv.Rows(e.RowIndex).ErrorText = "値が入力されていません。"

        e.Cancel = True

    End If

End Sub

 

Private Sub DataGridView1_CellValidated(ByVal sender As Object, _

        ByVal e As DataGridViewCellEventArgs) _

        Handles DataGridView1.CellValidated

    Dim dgv As DataGridView = CType(sender, DataGridView)

    dgv.Rows(e.RowIndex).ErrorText = Nothing

End Sub

28. DataGridView單元格輸入錯誤值事件的捕獲

Private Sub DataGridView1_DataError(ByVal sender As Object, _

        ByVal e As DataGridViewDataErrorEventArgs) _

        Handles DataGridView1.DataError

    If Not (e.Exception Is Nothing) Then

        MessageBox.Show(Me, _

            String.Format("({0}, {1}) のセルでエラーが発生しました。" + _

                vbCrLf + vbCrLf + "説明: {2}", _

                e.ColumnIndex, e.RowIndex, e.Exception.Message), _

            "エラーが発生しました", _

            MessageBoxButtons.OK, _

            MessageBoxIcon.Error)

    End If

End Sub

輸入錯誤值時返回原先數據

Private Sub DataGridView1_DataError(ByVal sender As Object, _

        ByVal e As DataGridViewDataErrorEventArgs) _

        Handles DataGridView1.DataError

    e.Cancel = False

End Sub

29. DataGridView行排序(點擊列表頭自動排序的設置)

For Each c As DataGridViewColumn In DataGridView1.Columns

    c.SortMode = DataGridViewColumnSortMode.NotSortable

Next c

30. DataGridView自動行排序(新追加值也會自動排序)

Private Sub Form1_Load(ByVal sender As System.Object, _

        ByVal e As System.EventArgs) Handles MyBase.Load

    Dim c As DataGridViewColumn

    For Each c In DataGridView1.Columns

        c.SortMode = DataGridViewColumnSortMode.Automatic

    Next c

End Sub

 

Private Sub Button1_Click(ByVal sender As System.Object, _

        ByVal e As System.EventArgs) Handles Button1.Click

    If DataGridView1.CurrentCell Is Nothing Then

        Return

    End If

 

    Dim sortColumn As DataGridViewColumn = _

        DataGridView1.CurrentCell.OwningColumn

 

    Dim sortDirection As System.ComponentModel.ListSortDirection = _

        System.ComponentModel.ListSortDirection.Ascending

    If Not (DataGridView1.SortedColumn Is Nothing) AndAlso _

            DataGridView1.SortedColumn.Equals(sortColumn) Then

        sortDirection = IIf(DataGridView1.SortOrder = SortOrder.Ascending, _

            System.ComponentModel.ListSortDirection.Descending, _

            System.ComponentModel.ListSortDirection.Ascending)

    End If

 

    DataGridView1.Sort(sortColumn, sortDirection)

End Sub

31. DataGridView自動行排序禁止情況下的排序

Private Sub DataGridView1_ColumnHeaderMouseClick(ByVal sender As Object, _

        ByVal e As DataGridViewCellMouseEventArgs) _

        Handles DataGridView1.ColumnHeaderMouseClick

    Dim clickedColumn As DataGridViewColumn = _

        DataGridView1.Columns(e.ColumnIndex)

    If clickedColumn.SortMode <> DataGridViewColumnSortMode.Automatic Then

        Me.SortRows(clickedColumn, True)

    End If

End Sub

 

Private Sub DataGridView1_RowsAdded(ByVal sender As Object, _

        ByVal e As DataGridViewRowsAddedEventArgs) _

        Handles DataGridView1.RowsAdded

    Me.SortRows(DataGridView1.SortedColumn, False)

End Sub

 

Private Sub DataGridView1_CellValueChanged(ByVal sender As Object, _

        ByVal e As DataGridViewCellEventArgs) _

        Handles DataGridView1.CellValueChanged

    If Not (DataGridView1.SortedColumn Is Nothing) AndAlso _

        e.ColumnIndex = DataGridView1.SortedColumn.Index Then

        Me.SortRows(DataGridView1.SortedColumn, False)

    End If

End Sub

 

Private Sub SortRows(ByVal sortColumn As DataGridViewColumn, _

        ByVal orderToggle As Boolean)

    If sortColumn Is Nothing Then

        Return

    End If

 

    If sortColumn.SortMode = DataGridViewColumnSortMode.Programmatic AndAlso _

        Not (DataGridView1.SortedColumn Is Nothing) AndAlso _

        Not DataGridView1.SortedColumn.Equals(sortColumn) Then

        DataGridView1.SortedColumn.HeaderCell.SortGlyphDirection = _

            SortOrder.None

    End If

 

    Dim sortDirection As System.ComponentModel.ListSortDirection

    If orderToggle Then

        sortDirection = IIf(DataGridView1.SortOrder = SortOrder.Descending, _

            System.ComponentModel.ListSortDirection.Ascending, _

            System.ComponentModel.ListSortDirection.Descending)

    Else

        sortDirection = IIf(DataGridView1.SortOrder = SortOrder.Descending, _

            System.ComponentModel.ListSortDirection.Descending, _

            System.ComponentModel.ListSortDirection.Ascending)

    End If

    Dim sOrder As SortOrder = _

        IIf(sortDirection = System.ComponentModel.ListSortDirection.Ascending, _

            SortOrder.Ascending, SortOrder.Descending)

    DataGridView1.Sort(sortColumn, sortDirection)

    If sortColumn.SortMode = DataGridViewColumnSortMode.Programmatic Then

        sortColumn.HeaderCell.SortGlyphDirection = sOrder

    End If

End Sub

32. DataGridView指定列指定排序

Dim dt As DataTable = CType(DataGridView1.DataSource, DataTable)

Dim dv As DataView = dt.DefaultView

dv.Sort = "Column1, Column2 ASC"

DataGridView1.Columns("Column1").HeaderCell.SortGlyphDirection = SortOrder.Ascending

DataGridView1.Columns("Column2").HeaderCell.SortGlyphDirection = SortOrder.Ascending

33. DataGridView單元格樣式設置

指定行列的樣式設定

DataGridView1.Columns(0).DefaultCellStyle.BackColor = Color.Aqua

DataGridView1.Rows(0).DefaultCellStyle.BackColor = Color.LightGray

奇數行樣式設定

DataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.GreenYellow

行,列表頭部的樣式設定

DataGridView1.ColumnHeadersDefaultCellStyle.BackColor = Color.Ivory

DataGridView1.RowHeadersDefaultCellStyle.BackColor = Color.Lime

樣式的優先順序

      一般單元格的樣式優先順位

  1. DataGridViewCell.Style
  2. DataGridViewRow.DefaultCellStyle
  3. DataGridView.AlternatingRowsDefaultCellStyle
  4. DataGridView.RowsDefaultCellStyle
  5. DataGridViewColumn.DefaultCellStyle
  6. DataGridView.DefaultCellStyle

表頭部的樣式優先順位

  1. DataGridViewCell.Style
  2. DataGridView.RowHeadersDefaultCellStyle
  3. DataGridView.ColumnHeadersDefaultCellStyle
  4. DataGridView.DefaultCellStyle

下例說明

DataGridView1.Columns(0).DefaultCellStyle.BackColor = Color.Aqua

DataGridView1.RowsDefaultCellStyle.BackColor = Color.Yellow

DataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.GreenYellow

DataGridView1.Rows(2).DefaultCellStyle.BackColor = Color.Pink

Console.WriteLine(DataGridView1.Columns(0).DefaultCellStyle.BackColor)

Console.WriteLine(DataGridView1.Columns(0).InheritedStyle.BackColor)

Console.WriteLine(DataGridView1.Rows(0).DefaultCellStyle.BackColor)

Console.WriteLine(DataGridView1.Rows(0).InheritedStyle.BackColor)

Console.WriteLine(DataGridView1.Rows(1).DefaultCellStyle.BackColor)

Console.WriteLine(DataGridView1.Rows(1).InheritedStyle.BackColor)

Console.WriteLine(DataGridView1.Rows(2).DefaultCellStyle.BackColor)

Console.WriteLine(DataGridView1.Rows(2).InheritedStyle.BackColor)

Console.WriteLine(DataGridView1(0, 2).Style.BackColor)

Console.WriteLine(DataGridView1(0, 2).InheritedStyle.BackColor)

 

復數行列的樣式設定

Dim cellStyle As New DataGridViewCellStyle()

cellStyle.BackColor = Color.Yellow

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

    If i Mod 2 = 0 Then

        DataGridView1.Columns(i).DefaultCellStyle = cellStyle

    End If

Next i

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

    If i Mod 2 = 0 Then

        DataGridView1.Columns(i).DefaultCellStyle.BackColor = Color.Yellow

    End If

Next i

34. DataGridView文字表示位置的設定

單元格的設定

DataGridView1.Columns("Column1").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter

表頭的設定

DataGridView1.Columns("Column1").HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter

35. DataGridView單元格內文字列換行

DataGridView1.Columns("Column1").DefaultCellStyle.WrapMode = DataGridViewTriState.True

DataGridView1.Columns("Column1").HeaderCell.Style.WrapMode = DataGridViewTriState.True

36. DataGridView單元格DBNull值表示的設定

DataGridView1.DefaultCellStyle.NullValue = "(指定されていません)"

單元格內NullValue屬性設定的值輸入,表示單元格內為Null值

DataGridView1.DefaultCellStyle.NullValue = "-"

DataGridView1.DefaultCellStyle.DataSourceNullValue = "X"

37. DataGridView單元格樣式格式化

DataGridView1.Columns(0).DefaultCellStyle.Format = "c"

DataGridView1.Columns(1).DefaultCellStyle.Format = "c"

DataGridView1.Columns(1).DefaultCellStyle.FormatProvider = New System.Globalization.CultureInfo("en-US")

Format的參數一覽(整數)

書式

説明

値が"123456"の時

 

書式なし

123456

C

通貨

\123,456

D

10進數

123456

E

指數

1.234560E+005

F

固定小數點

123456.00

G

一般

123456

N

數値

123,456.00

P

パーセント

12,345,600.00%

R

ラウンドトリップ

(エラーが出る)

X

16進數

1E240

0

 

123456

00000000

 

00123456

########

 

123456

#,##0

 

123,456

%0

 

%12345600

00.000E0

 

12.346E4

プラス#;マイナス#;ゼロ

 

プラス123456

iの値は「#」です。

 

iの値は「123456」です

 

Format的參數一覽(小數)

書式

説明

値が"1.23456789"の時

 

書式なし

1.23456789

C

通貨

\1

D

10進數

(エラーが出る)

E

指數

1.234568E+000

F

固定小數點

1.23

G

一般

1.23456789

N

數値

1.23

P

パーセント

123.46%

R

ラウンドトリップ

1.23456789

X

16進數

(エラーが出る)

00.0000000000

 

01.2345678900

##.##########

 

1.23456789

#,##0.000

 

1.235

%0.##

 

%123.46

00.000E0

 

12.346E-1

プラス#;マイナス#;ゼロ

 

プラス1.23

dの値は「#.##」です。

 

dの値は「1.23」です。

 

38. DataGridView指定單元格顏色設定

光標下的單元格顏色自動變換

Private Sub DataGridView1_CellMouseEnter(ByVal sender As Object, _

        ByVal e As DataGridViewCellEventArgs) _

        Handles DataGridView1.CellMouseEnter

    If e.ColumnIndex >= 0 And e.RowIndex >= 0 Then

        Dim dgv As DataGridView = CType(sender, DataGridView)

        dgv(e.ColumnIndex, e.RowIndex).Style.BackColor = Color.Red

        dgv(e.ColumnIndex, e.RowIndex).Style.SelectionBackColor = Color.Red

    End If

End Sub

 

Private Sub DataGridView1_CellMouseLeave(ByVal sender As Object, _

        ByVal e As DataGridViewCellEventArgs) _

        Handles DataGridView1.CellMouseLeave

    If e.ColumnIndex >= 0 And e.RowIndex >= 0 Then

        Dim dgv As DataGridView = CType(sender, DataGridView)

        dgv(e.ColumnIndex, e.RowIndex).Style.BackColor = Color.Empty

        dgv(e.ColumnIndex, e.RowIndex).Style.SelectionBackColor = Color.Empty

    End If

End Sub

表頭部單元格顏色設定

DataGridView1.ColumnHeadersDefaultCellStyle.BackColor = Color.Yellow

DataGridView1.RowHeadersDefaultCellStyle.BackColor = Color.YellowGreen

DataGridView1.TopLeftHeaderCell.Style.BackColor = Color.Blue

 

39. DataGridView單元格文字字體設置

光標下單元格字體設置為粗體

Private defaultCellStyle As DataGridViewCellStyle

Private mouseCellStyle As DataGridViewCellStyle

Private Sub Form1_Load(ByVal sender As System.Object, _

        ByVal e As System.EventArgs) Handles MyBase.Load

    Me.defaultCellStyle = New DataGridViewCellStyle()

    Me.mouseCellStyle = New DataGridViewCellStyle()

    Me.mouseCellStyle.Font = New Font(DataGridView1.Font, _

        DataGridView1.Font.Style Or FontStyle.Bold)

End Sub

Private Sub DataGridView1_CellMouseEnter(ByVal sender As Object, _

        ByVal e As DataGridViewCellEventArgs) _

        Handles DataGridView1.CellMouseEnter

    If e.ColumnIndex >= 0 And e.RowIndex >= 0 Then

        Dim dgv As DataGridView = CType(sender, DataGridView)

        dgv(e.ColumnIndex, e.RowIndex).Style = Me.mouseCellStyle

    End If

End Sub

Private Sub DataGridView1_CellMouseLeave(ByVal sender As Object, _

        ByVal e As DataGridViewCellEventArgs) _

        Handles DataGridView1.CellMouseLeave

    If e.ColumnIndex >= 0 And e.RowIndex >= 0 Then

        Dim dgv As DataGridView = CType(sender, DataGridView)

        dgv(e.ColumnIndex, e.RowIndex).Style = Me.defaultCellStyle

    End If

End Sub

40. DataGridView根據單元格值設定單元格樣式

單元格負數情況下顯示黃色,0的情況下顯示紅色

Private Sub DataGridView1_CellFormatting(ByVal sender As Object, _

        ByVal e As DataGridViewCellFormattingEventArgs) _

        Handles DataGridView1.CellFormatting

    Dim dgv As DataGridView = CType(sender, DataGridView)

    If dgv.Columns(e.ColumnIndex).Name = "Column1" AndAlso _

            TypeOf e.Value Is Integer Then

        Dim val As Integer = CInt(e.Value)

        If val < 0 Then

            e.CellStyle.BackColor = Color.Yellow

        Else If val = 0 Then

            e.CellStyle.BackColor = Color.Red

        End If

    End If

End Sub

41. DataGridView設置單元格背景顏色

Private Sub DataGridView1_CellPainting(ByVal sender As Object, _

        ByVal e As DataGridViewCellPaintingEventArgs) _

        Handles DataGridView1.CellPainting

    If e.ColumnIndex >= 0 AndAlso e.RowIndex >= 0 AndAlso _

        (e.PaintParts And DataGridViewPaintParts.Background) = _

            DataGridViewPaintParts.Background Then

        Dim bColor1, bColor2 As Color

        If (e.PaintParts And DataGridViewPaintParts.SelectionBackground) = _

                DataGridViewPaintParts.SelectionBackground AndAlso _

            (e.State And DataGridViewElementStates.Selected) = _

                DataGridViewElementStates.Selected Then

            bColor1 = e.CellStyle.SelectionBackColor

            bColor2 = Color.Black

        Else

            bColor1 = e.CellStyle.BackColor

            bColor2 = Color.LemonChiffon

        End If

 

        Dim b As New System.Drawing.Drawing2D.LinearGradientBrush( _

            e.CellBounds, bColor1, bColor2, _

            System.Drawing.Drawing2D.LinearGradientMode.Horizontal)

        Try

            e.Graphics.FillRectangle(b, e.CellBounds)

        Finally

            b.Dispose()

        End Try

 

        Dim paintParts As DataGridViewPaintParts = _

            e.PaintParts And Not DataGridViewPaintParts.Background

        e.Paint(e.ClipBounds, paintParts)

 

        e.Handled = True

    End If

End Sub

 

單元格背景顯示圖像

Private cellBackImage As New Bitmap("C:\back.gif")

Private Sub DataGridView1_CellPainting(ByVal sender As Object, _

        ByVal e As DataGridViewCellPaintingEventArgs) _

        Handles DataGridView1.CellPainting

    If e.ColumnIndex >= 0 AndAlso e.RowIndex >= 0 AndAlso _

        (e.PaintParts And DataGridViewPaintParts.Background) = _

            DataGridViewPaintParts.Background Then

        Dim backParts As DataGridViewPaintParts = _

            e.PaintParts And (DataGridViewPaintParts.Background Or _

                DataGridViewPaintParts.SelectionBackground)

        e.Paint(e.ClipBounds, backParts)

        Dim x As Integer = e.CellBounds.X + _

            (e.CellBounds.Width - cellBackImage.Width) / 2

        Dim y As Integer = e.CellBounds.Y + _

            (e.CellBounds.Height - cellBackImage.Height) / 2

        e.Graphics.DrawImage(cellBackImage, x, y)

 

        Dim paintParts As DataGridViewPaintParts = _

            e.PaintParts And Not backParts

        e.Paint(e.ClipBounds, paintParts)

        e.Handled = True

    End If

End Sub

42. DataGridView行樣式描畫

利用RowPostPaint事件描畫

Private Sub DataGridView1_RowPostPaint(ByVal sender As Object, _

        ByVal e As DataGridViewRowPostPaintEventArgs) _

        Handles DataGridView1.RowPostPaint

    Dim dgv As DataGridView = CType(sender, DataGridView)

    Dim linePen As Pen

    Select Case e.RowIndex Mod 3

        Case 0

            linePen = Pens.Blue

        Case 1

            linePen = Pens.Green

        Case Else

            linePen = Pens.Red

    End Select

    Dim startX As Integer = IIf(dgv.RowHeadersVisible, dgv.RowHeadersWidth, 0)

    Dim startY As Integer = e.RowBounds.Top + e.RowBounds.Height - 1

    Dim endX As Integer = startX + _

        dgv.Columns.GetColumnsWidth(DataGridViewElementStates.Visible) - _

        dgv.HorizontalScrollingOffset

    e.Graphics.DrawLine(linePen, startX, startY, endX, startY)

End Sub

 

利用RowPrePaint事件描畫

Private Sub DataGridView1_RowPrePaint(ByVal sender As Object, _

        ByVal e As DataGridViewRowPrePaintEventArgs) _

        Handles DataGridView1.RowPrePaint

    If (e.PaintParts And DataGridViewPaintParts.Background) = _

            DataGridViewPaintParts.Background Then

        Dim bColor1, bColor2 As Color

        If (e.PaintParts And DataGridViewPaintParts.SelectionBackground) = _

                DataGridViewPaintParts.SelectionBackground AndAlso _

            (e.State And DataGridViewElementStates.Selected) = _

                DataGridViewElementStates.Selected Then

            bColor1 = e.InheritedRowStyle.SelectionBackColor

            bColor2 = Color.Black

        Else

            bColor1 = e.InheritedRowStyle.BackColor

            bColor2 = Color.YellowGreen

        End If

 

        Dim dgv As DataGridView = CType(sender, DataGridView)

        Dim rectLeft2 As Integer = IIf(dgv.RowHeadersVisible, dgv.RowHeadersWidth, 0)

        Dim rectLeft As Integer = rectLeft2 - dgv.HorizontalScrollingOffset

        Dim rectWidth As Integer = dgv.Columns.GetColumnsWidth(DataGridViewElementStates.Visible)

        Dim rect As New Rectangle(rectLeft, e.RowBounds.Top, rectWidth, e.RowBounds.Height - 1)

        Using b As New System.Drawing.Drawing2D.LinearGradientBrush( _

            rect, bColor1, bColor2, _

            System.Drawing.Drawing2D.LinearGradientMode.Horizontal)

            rect.X = rectLeft2

            rect.Width -= dgv.HorizontalScrollingOffset

            e.Graphics.FillRectangle(b, rect)

        End Using

        e.PaintHeader(True)

        e.PaintParts = e.PaintParts And Not DataGridViewPaintParts.Background

    End If

End Sub

Private Sub DataGridView1_ColumnWidthChanged(ByVal sender As Object, _

        ByVal e As DataGridViewColumnEventArgs) _

        Handles DataGridView1.ColumnWidthChanged

    Dim dgv As DataGridView = CType(sender, DataGridView)

    dgv.Invalidate()

End Sub

 

43. DataGridView顯示行號

Private Sub DataGridView1_CellPainting(ByVal sender As Object, _

        ByVal e As DataGridViewCellPaintingEventArgs) _

        Handles DataGridView1.CellPainting

    If e.ColumnIndex < 0 And e.RowIndex >= 0 Then

        e.Paint(e.ClipBounds, DataGridViewPaintParts.All)

        Dim indexRect As Rectangle = e.CellBounds

        indexRect.Inflate(-2, -2)

        TextRenderer.DrawText(e.Graphics, _

            (e.RowIndex + 1).ToString(), _

            e.CellStyle.Font, _

            indexRect, _

            e.CellStyle.ForeColor, _

            TextFormatFlags.Right Or TextFormatFlags.VerticalCenter)

        e.Handled = True

    End If

End Sub

利用RowPostPaint事件描畫

Private Sub DataGridView1_RowPostPaint(ByVal sender As Object, _

        ByVal e As DataGridViewRowPostPaintEventArgs) _

        Handles DataGridView1.RowPostPaint

    Dim dgv As DataGridView = CType(sender, DataGridView)

    If dgv.RowHeadersVisible Then

        Dim rect As New Rectangle(e.RowBounds.Left, e.RowBounds.Top, _

            dgv.RowHeadersWidth, e.RowBounds.Height)

        rect.Inflate(-2, -2)

        TextRenderer.DrawText(e.Graphics, _

            (e.RowIndex + 1).ToString(), _

            e.InheritedRowStyle.Font, _

            rect, _

            e.InheritedRowStyle.ForeColor, _

            TextFormatFlags.Right Or TextFormatFlags.VerticalCenter)

    End If

End Sub

44. DataGridView焦點所在單元格焦點框不顯示的設定

Private Sub DataGridView1_CellPainting(ByVal sender As Object, _

        ByVal e As DataGridViewCellPaintingEventArgs) _

        Handles DataGridView1.CellPainting

    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

利用RowPrePaint事件實現

Private Sub DataGridView1_RowPrePaint(ByVal sender As Object, _

        ByVal e As DataGridViewRowPrePaintEventArgs) _

        Handles DataGridView1.RowPrePaint

    e.PaintParts = e.PaintParts And Not DataGridViewPaintParts.Focus

End Sub

45. DataGridView列中顯示選擇框CheckBox

Dim column As New DataGridViewCheckBoxColumn

DataGridView1.Columns.Add(column)

中間狀態在內的三種狀態表示

Dim column As DataGridViewCheckBoxColumn = CType(DataGridView1.Columns(0), DataGridViewCheckBoxColumn)

column.ThreeState = True

 

46. DataGridView中顯示下拉框ComboBox

Dim column As New DataGridViewComboBoxColumn()

column.Items.Add("日曜日")

column.Items.Add("月曜日")

column.Items.Add("火曜日")

column.Items.Add("水曜日")

column.Items.Add("木曜日")

column.Items.Add("金曜日")

column.Items.Add("土曜日")

column.DataPropertyName = "Week"

DataGridView1.Columns.Insert(DataGridView1.Columns("Week").Index, column)

DataGridView1.Columns.Remove("Week")

column.Name = "Week"

通過列Data綁定設置ComboBox

Dim weekTable As New DataTable("WeekTable")

weekTable.Columns.Add("Display", GetType(String))

weekTable.Columns.Add("Value", GetType(Integer))

weekTable.Rows.Add("日曜日", 0)

weekTable.Rows.Add("月曜日", 1)

weekTable.Rows.Add("火曜日", 2)

weekTable.Rows.Add("水曜日", 3)

weekTable.Rows.Add("木曜日", 4)

weekTable.Rows.Add("金曜日", 5)

weekTable.Rows.Add("土曜日", 6)

Dim column As New DataGridViewComboBoxColumn()

column.DataPropertyName = "Week"

column.DataSource = weekTable

column.ValueMember = "Value"

column.DisplayMember = "Display"

DataGridView1.Columns.Add(column)

默認狀態下,所有下拉框都顯示;DisplayStyleForCurrentCellOnly=True的狀態下,當前的單元格顯示下拉框,其余不顯示;還有一種就是光標移動時強調顯示。如下圖左中右三列。

 

47. DataGridView單擊打開下拉框

通常情況下要打開下拉框需要點擊目標單元格三次,第一次選中單元格,第二次進入編輯狀態,第三次才能打開下拉框

Private Sub DataGridView1_CellEnter(ByVal sender As Object, _

        ByVal e As DataGridViewCellEventArgs) _

        Handles DataGridView1.CellEnter

    Dim dgv As DataGridView = CType(sender, DataGridView)

    If dgv.Columns(e.ColumnIndex).Name = "ComboBox" AndAlso _

        TypeOf dgv.Columns(e.ColumnIndex) Is DataGridViewComboBoxColumn Then

        SendKeys.Send("{F4}")

    End If

End Sub

48. DataGridView中顯示按鈕

Dim column As New DataGridViewButtonColumn()

column.Name = "Button"

column.UseColumnTextForButtonValue = True

column.Text = "詳細閲覧"

DataGridView1.Columns.Add(column)

按鈕按下事件取得

Private Sub DataGridView1_CellContentClick(ByVal sender As Object, _

        ByVal e As DataGridViewCellEventArgs) _

        Handles DataGridView1.CellContentClick

    Dim dgv As DataGridView = CType(sender, DataGridView)

    If dgv.Columns(e.ColumnIndex).Name = "Button" Then

        MessageBox.Show((e.RowIndex.ToString() + _

            "行のボタンがクリックされました。"))

    End If

End Sub

49. DataGridView中顯示鏈接

Dim column As New DataGridViewLinkColumn()

column.Name = "Link"

column.UseColumnTextForLinkValue = True

column.Text = "詳細閲覧"

column.LinkBehavior = LinkBehavior.HoverUnderline

column.TrackVisitedState = True

DataGridView1.Columns.Add(column)

鏈接按下事件取得

Private Sub DataGridView1_CellContentClick(ByVal sender As Object, _

        ByVal e As DataGridViewCellEventArgs) _

        Handles DataGridView1.CellContentClick

    Dim dgv As DataGridView = CType(sender, DataGridView)

    If dgv.Columns(e.ColumnIndex).Name = "Link" Then

        MessageBox.Show((e.RowIndex.ToString() + "行のリンクがクリックされました。"))

        Dim cell As DataGridViewLinkCell = _

            CType(dgv(e.ColumnIndex, e.RowIndex), DataGridViewLinkCell)

        cell.LinkVisited = True

    End If

End Sub

50. DataGridView中顯示圖像

Dim column As New DataGridViewImageColumn()

column.Name = "Image"

column.ValuesAreIcons = False

column.Image = New Bitmap("C:\null.gif")

column.ImageLayout = DataGridViewImageCellLayout.Zoom

column.Description = "イメージ"

DataGridView1.Columns.Add(column)

DataGridView1("Image", 0).Value = New Bitmap("C:\top.gif") '

圖片屬性單元格未設值時紅差不顯示的設定

Dim imageColumn As DataGridViewImageColumn = CType(DataGridView1.Columns("Image"), DataGridViewImageColumn)

imageColumn.DefaultCellStyle.NullValue = Nothing

51. DataGridView編輯中單元格控件取得

Private Sub DataGridView1_EditingControlShowing(ByVal sender As Object, _

        ByVal e As DataGridViewEditingControlShowingEventArgs) _

        Handles DataGridView1.EditingControlShowing

    If TypeOf e.Control Is DataGridViewTextBoxEditingControl Then

        Dim dgv As DataGridView = CType(sender, DataGridView)

        Dim tb As DataGridViewTextBoxEditingControl = CType(e.Control, DataGridViewTextBoxEditingControl)

        If dgv.CurrentCell.OwningColumn.Name = "Column1" Then

            tb.ImeMode = Windows.Forms.ImeMode.Disable

        Else

            tb.ImeMode = dgv.ImeMode

        End If

    End If

End Sub

其他控件以此類推,比如DataGridViewCheckBoxColumn或者DataGridViewButtonColumn等等。

52. DataGridView輸入自動完成

Dim autoCompleteSource As New AutoCompleteStringCollection()

Private Sub DataGridView1_EditingControlShowing( _

        ByVal sender As Object, _

        ByVal e As DataGridViewEditingControlShowingEventArgs) _

        Handles DataGridView1.EditingControlShowing

    Dim dgv As DataGridView = CType(sender, DataGridView)

    If TypeOf e.Control Is TextBox Then

        Dim tb As TextBox = CType(e.Control, TextBox)

        If dgv.CurrentCell.OwningColumn.Name = "Column1" Then

            tb.AutoCompleteMode = AutoCompleteMode.SuggestAppend

            tb.AutoCompleteSource = _

                Windows.Forms.AutoCompleteSource.CustomSource

            tb.AutoCompleteCustomSource = Me.autoCompleteSource

        Else

            tb.AutoCompleteMode = AutoCompleteMode.None

        End If

    End If

End Sub

 

Private Sub DataGridView1_DataSourceChanged( _

        ByVal sender As Object, ByVal e As EventArgs) _

        Handles DataGridView1.DataSourceChanged

    Dim dgv As DataGridView = CType(sender, DataGridView)

    Me.autoCompleteSource.Clear()

    Dim r As DataGridViewRow

    For Each r In dgv.Rows

        Dim val As String = r.Cells("Column1").Value

        If Not String.IsNullOrEmpty(val) AndAlso _

                Not Me.autoCompleteSource.Contains(val) Then

            autoCompleteSource.Add(val)

        End If

    Next r

End Sub

 

Private Sub DataGridView1_CellValueChanged(ByVal sender As Object, _

        ByVal e As DataGridViewCellEventArgs) _

        Handles DataGridView1.CellValueChanged

    Dim dgv As DataGridView = CType(sender, DataGridView)

    If dgv.Columns(e.ColumnIndex).Name = "Column1" Then

        Dim val As String = dgv(e.ColumnIndex, e.RowIndex).Value

        If Not String.IsNullOrEmpty(val) AndAlso Not Me.autoCompleteSource.Contains(val) Then

            autoCompleteSource.Add(val)

        End If

    End If

End Sub

 

53. DataGridView單元格編輯時鍵盤KEY事件取得

Private Sub DataGridView1_EditingControlShowing(ByVal sender As Object, _

        ByVal e As DataGridViewEditingControlShowingEventArgs) _

        Handles DataGridView1.EditingControlShowing

    If TypeOf e.Control Is DataGridViewTextBoxEditingControl Then

        Dim dgv As DataGridView = CType(sender, DataGridView)

        Dim tb As DataGridViewTextBoxEditingControl = CType(e.Control, DataGridViewTextBoxEditingControl)

        RemoveHandler tb.KeyPress, AddressOf dataGridViewTextBox_KeyPress

 

        If dgv.CurrentCell.OwningColumn.Name = "Column1" Then

            AddHandler tb.KeyPress, AddressOf dataGridViewTextBox_KeyPress

        End If

    End If

End Sub

Private Sub dataGridViewTextBox_KeyPress(ByVal sender As Object, _

        ByVal e As KeyPressEventArgs) _

        Handles DataGridView1.KeyPress

    If e.KeyChar < "0"c Or e.KeyChar > "9"c Then

        e.Handled = True

    End If

End Sub

54. DataGridView下拉框(ComboBox)單元格編輯時事件取得

Private dataGridViewComboBox As DataGridViewComboBoxEditingControl = Nothing

Private Sub DataGridView1_EditingControlShowing(ByVal sender As Object, _

        ByVal e As DataGridViewEditingControlShowingEventArgs) _

        Handles DataGridView1.EditingControlShowing

    If TypeOf e.Control Is DataGridViewComboBoxEditingControl Then

        Dim dgv As DataGridView = CType(sender, DataGridView)

 

        If dgv.CurrentCell.OwningColumn.Name = "ComboBox" Then

            Me.dataGridViewComboBox = _

                CType(e.Control, DataGridViewComboBoxEditingControl)

            AddHandler Me.dataGridViewComboBox.SelectedIndexChanged, _

                AddressOf dataGridViewComboBox_SelectedIndexChanged

        End If

    End If

End Sub

Private Sub DataGridView1_CellEndEdit(ByVal sender As Object, _

        ByVal e As DataGridViewCellEventArgs) _

        Handles DataGridView1.CellEndEdit

    If Not (Me.dataGridViewComboBox Is Nothing) Then

        RemoveHandler Me.dataGridViewComboBox.SelectedIndexChanged, _

            AddressOf dataGridViewComboBox_SelectedIndexChanged

        Me.dataGridViewComboBox = Nothing

    End If

End Sub

Private Sub dataGridViewComboBox_SelectedIndexChanged(ByVal sender As Object, _

        ByVal e As EventArgs)

    Dim cb As DataGridViewComboBoxEditingControl = _

        CType(sender, DataGridViewComboBoxEditingControl)

    Console.WriteLine(cb.SelectedItem)

End Sub

55. DataGridView下拉框(ComboBox)單元格允許文字輸入設定

Private Sub DataGridView1_EditingControlShowing(ByVal sender As Object, _

        ByVal e As DataGridViewEditingControlShowingEventArgs) _

        Handles DataGridView1.EditingControlShowing

    If TypeOf e.Control Is DataGridViewComboBoxEditingControl Then

        Dim dgv As DataGridView = CType(sender, DataGridView)

        If dgv.CurrentCell.OwningColumn.Name = "ComboBox" Then

            Dim cb As DataGridViewComboBoxEditingControl = CType(e.Control, DataGridViewComboBoxEditingControl)

            cb.DropDownStyle = ComboBoxStyle.DropDown

        End If

    End If

End Sub

Private Sub DataGridView1_CellValidating(ByVal sender As Object, _

        ByVal e As DataGridViewCellValidatingEventArgs) _

        Handles DataGridView1.CellValidating

    Dim dgv As DataGridView = CType(sender, DataGridView)

    If dgv.Columns(e.ColumnIndex).Name = "ComboBox" AndAlso _

        TypeOf dgv.Columns(e.ColumnIndex) Is DataGridViewComboBoxColumn Then

        Dim cbc As DataGridViewComboBoxColumn = CType(dgv.Columns(e.ColumnIndex), DataGridViewComboBoxColumn)

        If Not cbc.Items.Contains(e.FormattedValue) Then

            cbc.Items.Add(e.FormattedValue)

        End If

    End If

End Sub

56. DataGridView根據值不同在另一列中顯示相應圖片

Public Class DataGridViewErrorIconColumn

    Inherits DataGridViewImageColumn

    Public Sub New()

        Me.CellTemplate = New DataGridViewErrorIconCell()

        Me.ValueType = Me.CellTemplate.ValueType

    End Sub

End Class

Public Class DataGridViewErrorIconCell

    Inherits DataGridViewImageCell

    Public Sub New()

        Me.ValueType = GetType(Integer)

    End Sub

    Protected Overrides Function GetFormattedValue( _

        ByVal value As Object, ByVal rowIndex As Integer, _

        ByRef cellStyle As DataGridViewCellStyle, _

        ByVal valueTypeConverter As System.ComponentModel.TypeConverter, _

        ByVal formattedValueTypeConverter As System.ComponentModel.TypeConverter, _

        ByVal context As DataGridViewDataErrorContexts) As Object

        Select Case CInt(value)

            Case 1

                Return SystemIcons.Information

            Case 2

                Return SystemIcons.Warning

            Case 3

                Return SystemIcons.Error

            Case Else

                Return Nothing

        End Select

    End Function

    Public Overrides ReadOnly Property DefaultNewRowValue() As Object

        Get

            Return 0

        End Get

    End Property

End Class

用法如下

Dim iconColumn As New DataGridViewErrorIconColumn()

iconColumn.DataPropertyName = "Column1"

DataGridView1.Columns.Add(iconColumn)

 

 

57. DataGridView中顯示進度條(ProgressBar)

Imports System

Imports System.Drawing

Imports System.Windows.Forms

Public Class DataGridViewProgressBarColumn

    Inherits DataGridViewTextBoxColumn

    Public Sub New()

        Me.CellTemplate = New DataGridViewProgressBarCell()

    End Sub

    Public Overrides Property CellTemplate() As DataGridViewCell

        Get

            Return MyBase.CellTemplate

        End Get

        Set(ByVal value As DataGridViewCell)

            If Not TypeOf value Is DataGridViewProgressBarCell Then

                Throw New InvalidCastException( _

                    "DataGridViewProgressBarCellオブジェクトを" + _

                    "指定してください。")

            End If

            MyBase.CellTemplate = value

        End Set

    End Property

 

    Public Property Maximum() As Integer

        Get

            Return CType(Me.CellTemplate, DataGridViewProgressBarCell).Maximum

        End Get

        Set(ByVal value As Integer)

            If Me.Maximum = value Then

                Return

            End If

            CType(Me.CellTemplate, DataGridViewProgressBarCell).Maximum = value

            If Me.DataGridView Is Nothing Then

                Return

            End If

            Dim rowCount As Integer = Me.DataGridView.RowCount

            Dim i As Integer

            For i = 0 To rowCount - 1

                Dim r As DataGridViewRow = Me.DataGridView.Rows.SharedRow(i)

                CType(r.Cells(Me.Index), DataGridViewProgressBarCell).Maximum = _

                    value

            Next i

        End Set

    End Property

 

    Public Property Mimimum() As Integer

        Get

            Return CType(Me.CellTemplate, DataGridViewProgressBarCell).Mimimum

        End Get

        Set(ByVal value As Integer)

            If Me.Mimimum = value Then

                Return

            End If

            CType(Me.CellTemplate, DataGridViewProgressBarCell).Mimimum = value

            If Me.DataGridView Is Nothing Then

                Return

            End If

            Dim rowCount As Integer = Me.DataGridView.RowCount

            Dim i As Integer

            For i = 0 To rowCount - 1

                Dim r As DataGridViewRow = Me.DataGridView.Rows.SharedRow(i)

                CType(r.Cells(Me.Index), DataGridViewProgressBarCell).Mimimum = _

                    value

            Next i

        End Set

    End Property

End Class

 

Public Class DataGridViewProgressBarCell

    Inherits DataGridViewTextBoxCell

    Public Sub New()

        Me.maximumValue = 100

        Me.mimimumValue = 0

    End Sub

 

    Private maximumValue As Integer

    Public Property Maximum() As Integer

        Get

            Return Me.maximumValue

        End Get

        Set(ByVal value As Integer)

            Me.maximumValue = value

        End Set

    End Property

 

    Private mimimumValue As Integer

    Public Property Mimimum() As Integer

        Get

            Return Me.mimimumValue

        End Get

        Set(ByVal value As Integer)

            Me.mimimumValue = value

        End Set

    End Property

 

    Public Overrides ReadOnly Property ValueType() As Type

        Get

            Return GetType(Integer)

        End Get

    End Property

 

    Public Overrides ReadOnly Property DefaultNewRowValue() As Object

        Get

            Return 0

        End Get

    End Property

 

    Public Overrides Function Clone() As Object

        Dim cell As DataGridViewProgressBarCell = _

            CType(MyBase.Clone(), DataGridViewProgressBarCell)

        cell.Maximum = Me.Maximum

        cell.Mimimum = Me.Mimimum

        Return cell

    End Function

 

    Protected Overrides Sub Paint(ByVal graphics As Graphics, _

        ByVal clipBounds As Rectangle, _

        ByVal cellBounds As Rectangle, _

        ByVal rowIndex As Integer, _

        ByVal cellState As DataGridViewElementStates, _

        ByVal value As Object, _

        ByVal formattedValue As Object, _

        ByVal errorText As String, _

        ByVal cellStyle As DataGridViewCellStyle, _

        ByVal advancedBorderStyle As DataGridViewAdvancedBorderStyle, _

        ByVal paintParts As DataGridViewPaintParts)

 

        Dim intValue As Integer = 0

        If TypeOf value Is Integer Then

            intValue = CInt(value)

        End If

        If intValue < Me.mimimumValue Then

            intValue = Me.mimimumValue

        End If

        If intValue > Me.maximumValue Then

            intValue = Me.maximumValue

        End If

        Dim rate As Double = CDbl(intValue - Me.mimimumValue) / _

            (Me.maximumValue - Me.mimimumValue)

 

        If (paintParts And DataGridViewPaintParts.Border) = _

                DataGridViewPaintParts.Border Then

            Me.PaintBorder(graphics, clipBounds, cellBounds, _

                cellStyle, advancedBorderStyle)

        End If

 

        Dim borderRect As Rectangle = Me.BorderWidths(advancedBorderStyle)

        Dim paintRect As New Rectangle(cellBounds.Left + borderRect.Left, _

            cellBounds.Top + borderRect.Top, _

            cellBounds.Width - borderRect.Right, _

            cellBounds.Height - borderRect.Bottom)

 

        Dim isSelected As Boolean = _

            ((cellState And DataGridViewElementStates.Selected) = _

                DataGridViewElementStates.Selected)

        Dim bkColor As Color

        If isSelected AndAlso _

            (paintParts And DataGridViewPaintParts.SelectionBackground) = _

                DataGridViewPaintParts.SelectionBackground Then

            bkColor = cellStyle.SelectionBackColor

        Else

            bkColor = cellStyle.BackColor

        End If

 

        If (paintParts And DataGridViewPaintParts.Background) = _

            DataGridViewPaintParts.Background Then

            Dim backBrush As New SolidBrush(bkColor)

            Try

                graphics.FillRectangle(backBrush, paintRect)

            Finally

                backBrush.Dispose()

            End Try

        End If

 

        paintRect.Offset(cellStyle.Padding.Right, cellStyle.Padding.Top)

        paintRect.Width -= cellStyle.Padding.Horizontal

        paintRect.Height -= cellStyle.Padding.Vertical

 

        If (paintParts And DataGridViewPaintParts.ContentForeground) = _

            DataGridViewPaintParts.ContentForeground Then

            If ProgressBarRenderer.IsSupported Then

 

                ProgressBarRenderer.DrawHorizontalBar(graphics, paintRect)

                Dim barBounds As New Rectangle(paintRect.Left + 3, _

                    paintRect.Top + 3, _

                    paintRect.Width - 4, _

                    paintRect.Height - 6)

                barBounds.Width = CInt(Math.Round((barBounds.Width * rate)))

                ProgressBarRenderer.DrawHorizontalChunks(graphics, barBounds)

            Else

                graphics.FillRectangle(Brushes.White, paintRect)

                graphics.DrawRectangle(Pens.Black, paintRect)

                Dim barBounds As New Rectangle(paintRect.Left + 1, _

                    paintRect.Top + 1, _

                    paintRect.Width - 1, _

                    paintRect.Height - 1)

                barBounds.Width = CInt(Math.Round((barBounds.Width * rate)))

                graphics.FillRectangle(Brushes.Blue, barBounds)

            End If

        End If

 

        If Me.DataGridView.CurrentCellAddress.X = Me.ColumnIndex AndAlso _

            Me.DataGridView.CurrentCellAddress.Y = Me.RowIndex AndAlso _

            (paintParts And DataGridViewPaintParts.Focus) = _

                DataGridViewPaintParts.Focus AndAlso _

            Me.DataGridView.Focused Then

 

            Dim focusRect As Rectangle = paintRect

            focusRect.Inflate(-3, -3)

            ControlPaint.DrawFocusRectangle(graphics, focusRect)

        End If

        If (paintParts And DataGridViewPaintParts.ContentForeground) = _

            DataGridViewPaintParts.ContentForeground Then

            Dim txt As String = String.Format("{0}%", Math.Round((rate * 100)))

            Dim flags As TextFormatFlags = _

                TextFormatFlags.HorizontalCenter Or _

                    TextFormatFlags.VerticalCenter

            Dim fColor As Color = cellStyle.ForeColor

            paintRect.Inflate(-2, -2)

            TextRenderer.DrawText(graphics, txt, cellStyle.Font, paintRect, fColor, flags)

        End If

 

        If (paintParts And DataGridViewPaintParts.ErrorIcon) = _

                DataGridViewPaintParts.ErrorIcon AndAlso _

            Me.DataGridView.ShowCellErrors AndAlso _

            Not String.IsNullOrEmpty(errorText) Then

 

            Dim iconBounds As Rectangle = Me.GetErrorIconBounds(graphics, cellStyle, rowIndex)

            iconBounds.Offset(cellBounds.X, cellBounds.Y)

            Me.PaintErrorIcon(graphics, iconBounds, cellBounds, errorText)

        End If

    End Sub

End Class

用法如下

Dim pbColumn As New DataGridViewProgressBarColumn()

pbColumn.DataPropertyName = "Column1"

DataGridView1.Columns.Add(pbColumn)

 

58. DataGridView中添加MaskedTextBox

Imports System

Imports System.Windows.Forms

Public Class DataGridViewMaskedTextBoxColumn

    Inherits DataGridViewColumn

    Public Sub New()

        MyBase.New(New DataGridViewMaskedTextBoxCell())

    End Sub

 

    Private maskValue As String = ""

    Public Property Mask() As String

        Get

            Return Me.maskValue

        End Get

        Set(ByVal value As String)

            Me.maskValue = value

        End Set

    End Property

 

    Public Overrides Function Clone() As Object

        Dim col As DataGridViewMaskedTextBoxColumn = _

            CType(MyBase.Clone(), DataGridViewMaskedTextBoxColumn)

        col.Mask = Me.Mask

        Return col

    End Function

 

    Public Overrides Property CellTemplate() As DataGridViewCell

        Get

            Return MyBase.CellTemplate

        End Get

        Set(ByVal value As DataGridViewCell)

            If Not TypeOf value Is DataGridViewMaskedTextBoxCell Then

                Throw New InvalidCastException( _

                    "DataGridViewMaskedTextBoxCellオブジェクトを" + _

                    "指定してください。")

            End If

            MyBase.CellTemplate = value

        End Set

    End Property

End Class

 

Public Class DataGridViewMaskedTextBoxCell

    Inherits DataGridViewTextBoxCell

    Public Sub New()

    End Sub

 

    Public Overrides Sub InitializeEditingControl(ByVal rowIndex As Integer, _

        ByVal initialFormattedValue As Object, _

        ByVal dataGridViewCellStyle As DataGridViewCellStyle)

        MyBase.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle)

 

        Dim maskedBox As DataGridViewMaskedTextBoxEditingControl = _

            Me.DataGridView.EditingControl

        If Not (maskedBox Is Nothing) Then

            maskedBox.Text = IIf(Me.Value Is Nothing, "", Me.Value.ToString())

            Dim column As DataGridViewMaskedTextBoxColumn = Me.OwningColumn

            If Not (column Is Nothing) Then

                maskedBox.Mask = column.Mask

            End If

        End If

    End Sub

 

    Public Overrides ReadOnly Property EditType() As Type

        Get

            Return GetType(DataGridViewMaskedTextBoxEditingControl)

        End Get

    End Property

    Public Overrides ReadOnly Property ValueType() As Type

        Get

            Return GetType(Object)

        End Get

    End Property

 

    Public Overrides ReadOnly Property DefaultNewRowValue() As Object

        Get

            Return MyBase.DefaultNewRowValue

        End Get

    End Property

End Class

 

Public Class DataGridViewMaskedTextBoxEditingControl

    Inherits MaskedTextBox

    Implements IDataGridViewEditingControl

 

    Private dataGridView As DataGridView

    Private rowIndex As Integer

    Private valueChanged As Boolean

 

    Public Sub New()

        Me.TabStop = False

    End Sub

 

    Public Function GetEditingControlFormattedValue( _

        ByVal context As DataGridViewDataErrorContexts) As Object _

        Implements IDataGridViewEditingControl.GetEditingControlFormattedValue

 

        Return Me.Text

    End Function

 

    Public Property EditingControlFormattedValue() As Object _

        Implements IDataGridViewEditingControl.EditingControlFormattedValue

        Get

            Return Me.GetEditingControlFormattedValue(DataGridViewDataErrorContexts.Formatting)

        End Get

        Set(ByVal value As Object)

            Me.Text = CStr(value)

        End Set

    End Property

 

    Public Sub ApplyCellStyleToEditingControl( _

        ByVal dataGridViewCellStyle As DataGridViewCellStyle) _

        Implements IDataGridViewEditingControl.ApplyCellStyleToEditingControl

 

        Me.Font = dataGridViewCellStyle.Font

        Me.ForeColor = dataGridViewCellStyle.ForeColor

        Me.BackColor = dataGridViewCellStyle.BackColor

        Select Case dataGridViewCellStyle.Alignment

            Case DataGridViewContentAlignment.BottomCenter, _

                    DataGridViewContentAlignment.MiddleCenter, _

                    DataGridViewContentAlignment.TopCenter

                Me.TextAlign = HorizontalAlignment.Center

            Case DataGridViewContentAlignment.BottomRight, _

                    DataGridViewContentAlignment.MiddleRight, _

                    DataGridViewContentAlignment.TopRight

                Me.TextAlign = HorizontalAlignment.Right

            Case Else

                Me.TextAlign = HorizontalAlignment.Left

        End Select

    End Sub

 

    Public Property EditingControlDataGridView() As DataGridView _

        Implements IDataGridViewEditingControl.EditingControlDataGridView

        Get

            Return Me.dataGridView

        End Get

        Set(ByVal value As DataGridView)

            Me.dataGridView = value

        End Set

    End Property

 

    Public Property EditingControlRowIndex() As Integer _

        Implements IDataGridViewEditingControl.EditingControlRowIndex

        Get

            Return Me.rowIndex

        End Get

        Set(ByVal value As Integer)

            Me.rowIndex = value

        End Set

    End Property

 

    Public Property EditingControlValueChanged() As Boolean _

        Implements IDataGridViewEditingControl.EditingControlValueChanged

        Get

            Return Me.valueChanged

        End Get

        Set(ByVal value As Boolean)

            Me.valueChanged = value

        End Set

    End Property

 

    Public Function EditingControlWantsInputKey(ByVal keyData As Keys, _

        ByVal dataGridViewWantsInputKey As Boolean) As Boolean _

        Implements IDataGridViewEditingControl.EditingControlWantsInputKey

 

        Select Case keyData And Keys.KeyCode

            Case Keys.Right, Keys.End, Keys.Left, Keys.Home

                Return True

            Case Else

                Return False

        End Select

    End Function

 

    Public ReadOnly Property EditingPanelCursor() As Cursor _

        Implements IDataGridViewEditingControl.EditingPanelCursor

        Get

            Return MyBase.Cursor

        End Get

    End Property

 

    Public Sub PrepareEditingControlForEdit(ByVal selectAll As Boolean) _

        Implements IDataGridViewEditingControl.PrepareEditingControlForEdit

        If selectAll Then

            Me.SelectAll()

        Else

            Me.SelectionStart = Me.TextLength

        End If

    End Sub

 

    Public ReadOnly Property RepositionEditingControlOnValueChange() _

        As Boolean _

        Implements _

            IDataGridViewEditingControl.RepositionEditingControlOnValueChange

        Get

            Return False

        End Get

    End Property

 

    Protected Overrides Sub OnTextChanged(ByVal e As EventArgs)

        MyBase.OnTextChanged(e)

        Me.valueChanged = True

        Me.dataGridView.NotifyCurrentCellDirty(True)

    End Sub

End Class

用法如下

'DataGridViewMaskedTextBoxColumnを作成

Dim maskedColumn As New DataGridViewMaskedTextBoxColumn()

maskedColumn.DataPropertyName = "Column1"

maskedColumn.Mask = "000"

DataGridView1.Columns.Add(maskedColumn)

59. DataGridView中Enter鍵按下焦點移至旁邊的單元格

Imports System

Imports System.Windows.Forms

Public Class DataGridViewEx

    Inherits DataGridView

    Protected Overrides Function ProcessDialogKey( _

            ByVal keyData As Keys) As Boolean

        If (keyData And Keys.KeyCode) = Keys.Enter Then

            Return Me.ProcessTabKey(keyData)

        End If

        Return MyBase.ProcessDialogKey(keyData)

    End Function

    Protected Overrides Function ProcessDataGridViewKey( _

            ByVal e As KeyEventArgs) As Boolean

        If e.KeyCode = Keys.Enter Then

            Return Me.ProcessTabKey(e.KeyCode)

        End If

        Return MyBase.ProcessDataGridViewKey(e)

    End Function

End Class

60. DataGridView行集合化(Group)

Private defaultCellStyle As DataGridViewCellStyle

Private groupCellStyle As DataGridViewCellStyle

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    Me.defaultCellStyle = New DataGridViewCellStyle()

    Me.groupCellStyle = New DataGridViewCellStyle()

    Me.groupCellStyle.ForeColor = Color.White

    Me.groupCellStyle.BackColor = Color.DarkGreen

    Me.groupCellStyle.SelectionBackColor = Color.DarkBlue

End Sub

 

Private Sub DataGridView1_CellFormatting(ByVal sender As Object, _

        ByVal e As DataGridViewCellFormattingEventArgs) _

        Handles DataGridView1.CellFormatting

    Dim dgv As DataGridView = CType(sender, DataGridView)

    If e.ColumnIndex = 0 AndAlso e.RowIndex >= 0 AndAlso _

        e.RowIndex <> dgv.NewRowIndex Then

        If e.RowIndex = 0 OrElse _

            Not dgv(e.ColumnIndex, e.RowIndex - 1).Value.Equals(e.Value) Then

            dgv.Rows(e.RowIndex).DefaultCellStyle = Me.groupCellStyle

        Else

            dgv.Rows(e.RowIndex).DefaultCellStyle = Me.defaultCellStyle

            e.Value = ""

            e.FormattingApplied = True

        End If

    End If

End Sub

文章出處:https://blog.csdn.net/ibmfahsion/article/details/7929576


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM