簡體   English   中英

DataGridView丟失了DataTable.AcceptChanges的單元格格式

[英]DataGridView loses cell formatting from DataTable.AcceptChanges

VB2010。 我已經研究了這個問題,但似乎找不到原因或解決方法。 我所擁有的是綁定到DataTable的DataGridView。 我允許用戶選擇“編輯”模式,以打開/關閉ReadOnly屬性。 一旦ReadMode = True,我確保將DataTable設置為AcceptChanges。 設置此屬性后,我所有的單元格格式都消失了。

我在表單加載中執行此操作:

Private Sub frmMain_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
   dgv.DataSource = Nothing
   dgv.DataSource = GetTripData()
   dgv.AutoResizeColumns()
   dgv.ClearSelection()
   dgv.ReadOnly = True
End Sub

然后,用戶可以單擊菜單項進入“編輯模式”:

Private Sub mnuEditMode_Click(sender As System.Object, e As System.EventArgs) Handles mnuEditMode.Click
    If mnuEditMode.Checked Then
        dgv.ReadOnly = False
        dgv.AllowUserToAddRows = True
        dgv.AllowUserToDeleteRows = True
    Else
        dgv.ReadOnly = True
        dgv.AllowUserToAddRows = False
        dgv.AllowUserToDeleteRows = False

        'accept all changes. if we dont do this any row that is deleted will still exist in the DataTable.
        Dim dt As DataTable = CType(dgv.DataSource, DataTable)
        If dt IsNot Nothing Then
            dt.AcceptChanges() 'note: this causes custom cell font to be cleared
        End If
    End If
End Sub

進入編輯模式后,他們可以決定要更改的單元格。 他們放入列表中要更改的兩個單元格被這樣處理:

'update the proper cells via the DataGridView
dgv.Rows(2).Cells(5).Value = "HOME"
dgv.Rows(2).Cells(6).Value = 10

'bold the cell's font in the DataGridView
Dim styleUpdated As New DataGridViewCellStyle
styleUpdated.Font = New Font(dgv.Font, FontStyle.Bold)
dgv.Rows(2).Cells(6).Style = styleUpdated
dgv.Rows(2).Cells(6).Style = styleUpdated

'refresh the DGV
dgv.Refresh()

這可行! 我可以看到DGV中的更改。 現在,他們已經完成了編輯數據的工作,因此可以單擊菜單項將“編輯模式”設置為“關”,從而將dgv.ReadOnly = True設置為dt.AcceptChanges。 最后一種方法AcceptChanges清除修改的單元格上的所有粗體字體。

這是預期的行為嗎? 如果是這樣,有什么建議可以保持編輯后的單元格格式?

這並不是一個真正的答案,但我想發布大量代碼,因此我將其發布為答案。 我剛剛測試了以下代碼,它對我Buttons因為單擊兩個Buttons ,粗體文本仍然保留。

Public Class Form1

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim table As New DataTable

        With table.Columns
            .Add("Id", GetType(Integer))
            .Add("Name", GetType(String))
            .Add("Age", GetType(Integer))
        End With

        With table.Rows
            .Add(1, "Mary", 20)
            .Add(2, "Paul", 30)
            .Add(3, "Peter", 40)
        End With

        DataGridView1.DataSource = table

        Dim style = DataGridView1.Rows(1).Cells(1).Style

        style.Font = New Font(DataGridView1.Font, FontStyle.Bold)
        DataGridView1.Rows(1).Cells(1).Style = style
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        With DataGridView1
            .ReadOnly = True
            .AllowUserToAddRows = False
            .AllowUserToDeleteRows = False
        End With
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        With DataGridView1
            .ReadOnly = False
            .AllowUserToAddRows = True
            .AllowUserToDeleteRows = True
        End With
    End Sub

End Class

我建議您隨手編寫該代碼,如果對您有用,那么您會知道原始項目中還有其他事情在進行。 然后,您可以緩慢地修改該測試項目,使其變得與現有項目越來越相似,然后您應該能夠看到該功能在何處中斷。

我看了一些,我認為單元格格式化清除是預期的行為。 因此,我想出了一個小例程,該例程將保存每個單元格的格式,然后在AcceptChanges之后重新應用它。 請注意,我的DataTable很小,因此如果數據集很大,可能會降低性能。 如果我錯過了什么,請提供任何反饋:

'updated routine to implement AcceptChanges
'dt.AcceptChanges() 'note: this causes custom cell font to be cleared
 DgvAcceptChanges(dgvMain)

''' <summary>
''' this routine will take a DataGridView and save the style for each cell, then it will take it's DataTable source and accept any
''' changes, then it will re-apply the style font to each DataGridView cell. this is required since DataTable.AcceptChanges will
''' clear any DataGridView cell formatting.
''' </summary>
''' <param name="dgv">DataGridView object</param>
''' <remarks>Could be extended to do other things like cell ReadOnly status or cell BackColor.</remarks>
Public Sub DgvAcceptChanges(dgv As DataGridView)
    Dim dt As DataTable = CType(dgv.DataSource, DataTable)
    If dt IsNot Nothing Then
        'save the DataGridView's cell style font to an array
        Dim cellStyle(dgv.Rows.Count - 1, dgv.Columns.Count - 1) As DataGridViewCellStyle
        For r As Integer = 0 To dgv.Rows.Count - 1
            'the DataGridViewRow.IsNewRow Property = Gets a value indicating whether the row is the row for new records.
            'Remarks: Because the row for new records is in the Rows collection, use the IsNewRow property to determine whether a row
            'is the row for new records or is a populated row. A row stops being the new row when data entry into the row begins.
            If Not dgv.Rows(r).IsNewRow Then
                For c As Integer = 0 To dgv.Columns.Count - 1
                    cellStyle(r, c) = dgv.Rows(r).Cells(c).Style
                Next c
            End If
        Next r

        'this causes custom cell font to be cleared in the DataGridView
        dt.AcceptChanges()

        're-apply the DataGridView's cell style font from an array
        For r As Integer = 0 To dgv.Rows.Count - 1
            If Not dgv.Rows(r).IsNewRow Then
                For c As Integer = 0 To dgv.Columns.Count - 1
                    dgv.Rows(r).Cells(c).Style.Font = cellStyle(r, c).Font
                Next c
            End If
        Next r
    End If
End Sub

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM