我有一个显示数据库条目的 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
