Skip to main content
 首页 » 编程设计

vb.net中Datagridview Vb.net 中超过约 43,700 个字符的文本消失

2025年12月25日135artech

我有一个显示数据库条目的 DataGridView。问题是我的许多很长的字符串没有出现在单元格中。数据就在那里,因为我可以选择单元格,复制内容,然后将它们粘贴到文本文件中,它们就在那里。就好像一旦超过 43,700 个字符,Datagridview 就会将文本颜色更改为白色。关于如何解决这个问题有什么想法吗?

Pic-Datagridview not displaying text >~43,700 characters

我尝试将单元格设置为换行并自动调整行和列的大小,但这实际上使问题在字符数较少时发生(使情况变得更糟)。 我还发现了一篇非常古老的帖子,与“.NET Windows forms DataGridView Cell text disappears when added programatically”有些相关。然而,这个问题发生在 4,563 个字符处,并且没有得到解决。

此外,我正在使用 Visual Basic。

如有任何帮助,我们将不胜感激。

请您参考如下方法:

我可以重现您的问题。

DataGridViewTextBoxCell.Paint方法使用被调用的 PaintPrivate Method 中的 TextRenderer.DrawText 方法。

This post描述了如果文本超过 43679 个字符(与您发现的限制类似)时 TextRender.MeasureText 方法返回无效值的问题。由于 MeasureText 还涉及对 DrawText 的调用,因此这两个问题是相关的。

一个简单的解决方法是处理 DataGridView.CellFormatting Event并将格式化字符串截断为 magic 字符串长度。

Const magicMaxStringLength As Int32 = 43679 
Private Sub DataGridView1_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles DataGridView1.CellFormatting 
    Dim str As String = TryCast(e.Value, String) 
    If str IsNot Nothing AndAlso str.Length >= 43679 Then 
        e.Value = str.Substring(0, 43679) 
        e.FormattingApplied = True 
    End If 
End Sub 

请注意,此截断不会更改基础单元格值。

Edir:上面允许 DGV 显示文本,但是似乎相同的限制也适用于 DataGridViewTextBoxEditingControl。因此,编辑时文本不可见。要克服此限制,您可以交换 RichTextBox 用作编辑控件。

Private rtbEdit As New RichTextBox 
Private Sub DataGridView1_EditingControlShowing(sender As Object, e As DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing 
    Dim tb As System.Windows.Forms.DataGridViewTextBoxEditingControl = TryCast(e.Control, System.Windows.Forms.DataGridViewTextBoxEditingControl) 
    If tb IsNot Nothing AndAlso tb.Text.Length >= magicMaxStringLength Then 
        rtbEdit.Text = tb.Text 
        rtbEdit.Margin = New Padding(0) 
        rtbEdit.AutoSize = False 
        rtbEdit.Font = tb.Font 
        rtbEdit.ClientSize = DataGridView1.EditingPanel.ClientSize 
        rtbEdit.WordWrap = False 
        rtbEdit.Multiline = tb.Multiline 
        DataGridView1.EditingPanel.Controls.Remove(e.Control) 
        DataGridView1.EditingPanel.Controls.Add(rtbEdit) 
        RemoveHandler DataGridView1.EditingPanel.VisibleChanged, AddressOf DataGridView1EditingPanel_VisibleChanged 
        AddHandler DataGridView1.EditingPanel.VisibleChanged, AddressOf DataGridView1EditingPanel_VisibleChanged 
        RemoveHandler DataGridView1.EditingPanel.SizeChanged, AddressOf DataGridView1EditingPanel_SizeChanged 
        AddHandler DataGridView1.EditingPanel.SizeChanged, AddressOf DataGridView1EditingPanel_SizeChanged 
    End If 
End Sub 
 
Private Sub DataGridView1EditingPanel_SizeChanged(sender As Object, e As EventArgs) 
    RemoveHandler DataGridView1.EditingPanel.SizeChanged, AddressOf DataGridView1EditingPanel_SizeChanged 
    rtbEdit.ClientSize = DataGridView1.EditingPanel.ClientSize 
End Sub 
 
Private Sub DataGridView1EditingPanel_VisibleChanged(sender As Object, e As EventArgs) 
    If Not DataGridView1.EditingPanel.Visible Then 
        DataGridView1.EditingPanel.Controls.Remove(rtbEdit) 
        DataGridView1.CurrentCell.Value = rtbEdit.Text 
        RemoveHandler DataGridView1.EditingPanel.VisibleChanged, AddressOf DataGridView1EditingPanel_VisibleChanged 
    End If 
End Sub