Текст больше чем 43,700 символов исчезают в Datagridview Vb.net - PullRequest
0 голосов
/ 13 октября 2018

У меня есть DataGridView, который отображает записи базы данных.Проблема в том, что многие из моих очень длинных строк не отображаются в ячейках.Данные есть, потому что я могу выбрать ячейку, скопировать содержимое, а затем вставить их в текстовый файл, и они есть.Похоже, что Datagridview меняет цвет текста на белый, когда превышено ~ 43 700 символов.Любые идеи о том, как это исправить?

Pic-Datagridview не отображает текст> ~ 43 700 символов

Я попытался установить ячейки в Wraptext и автоматически изменять размеры строк истолбцы, но на самом деле проблема возникает при меньшем количестве символов (усугубляет).Я также нашел очень старый предыдущий пост, который несколько уместен в « .NET Windows формы DataGridView Ячейка текста исчезает при программном добавлении ».Тем не менее, это происходило в 4563 символов и не было решено.

Кроме того, я использую Visual Basic.

Любая помощь будет оценена.

1 Ответ

0 голосов
/ 14 октября 2018

Я могу воспроизвести вашу проблему.

Метод DataGridViewTextBoxCell.Paint использует метод TextRenderer.DrawText в вызываемом методе PaintPrivate .

В этом посте описывается проблема с методом TextRender.MeasureText, возвращающим недопустимые значения, если текст превышает 43679 символов, что аналогично обнаруженному вами пределу.Поскольку MeasureText также включает вызов DrawText, эти две проблемы связаны между собой.

Простой обходной путь - обработать событие DataGridView.CellFormatting и усечь отформатированную строку до магия длина строки.

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
...