Windows Forms: режим упаковки ячеек для отображения адаптивного многоточия

Я использую Windows Forms Datagridview для отображения некоторого (длинного) текста. (Код - PowerShell, но проблема связана с режимом упаковки ячеек)

$TestGridView = New-Object System.Windows.Forms.DataGridView -Property @{
    Name="TestDataGridView"
    AllowUserToAddRows = $False
    AllowUserToDeleteRows = $False
    Location = "14,225"
    Size = "1041,328"
    TabIndex = 1
    DefaultCellStyle= @{WrapMode ='True'}
    RowHeadersVisible=$False
    AutoSizeColumnsMode='Fill'
    AutoSizeRowsMode = 'AllCells' 
    Anchor = 'Left, Right, Top, Bottom'
    DefaultCellStyle.Padding =  new-object Windows.Forms.Padding -a 2
}

Я использую обертку ячеек и AutosizeRowMode, но я не нашел способа, чтобы ячейка DGV отображалась до определенной точки, а затем усекалась многоточием при превышении размера ячейки. Я бы хотел сделать следующее: (графическое редактирование)

Desired

но пока мне не удалось этого сделать:

WrapMode = False, AutoSizeRowsMode = AllCells

усекает многоточием, но удаляет все CRLF и отображает только одну строку

WrapMode = False, AutoSizeRowsMode = AllCells

WrapMode = False, AutoSizeRowsMode = None

Высота строки установлена ​​на желаемое значение, но в остальном усечение такое же, как указано выше

WrapMode = False, AutoSizeRowsMode = None

WrapMode = True, AutoSizeRowsMode = AllCells

Без усечения, отображается весь текст, а высота ячейки адаптирована для размещения всего текста.

WrapMode = True, AutoSizeRowsMode = AllCells

WrapMode = True, AutoSizeRowsMode = None

Высота остается прежней, но усечение не выполняется.

WrapMode = True, AutoSizeRowsMode = None

Я пытаюсь добиться максимального увеличения размера строк, после чего текст должен быть усечен многоточием [...]

Я уже пробовал обрезать содержимое, но у него есть отрицательный побочный эффект: когда пользователь КОПИРУЕТ содержимое ячейки, в содержимом ячейки отсутствует вся усеченная часть (конечно), поэтому это не жизнеспособный вариант.

Большое спасибо


person Aldo    schedule 29.05.2018    source источник


Ответы (1)


Вам нужно обработать _ 1_ и нарисуйте текст самостоятельно, применив перенос слов и многоточие:

Function dgv_CellPainting{[CmdletBinding()]param( 
    [parameter()] 
    [Object]$sender, 
    [parameter()] 
    [System.Windows.Forms.DataGridViewCellPaintingEventArgs]$e 
) 
    #Don't process if it's not the column which we want or it's a header row
    if (($e.ColumnIndex -ne 0) -or ($e.RowIndex -lt 0)){ return }

    #Paint all parts but text        
    $e.Paint($e.CellBounds, [System.Windows.Forms.DataGridViewPaintParts]::All `
        -band (-bnot([System.Windows.Forms.DataGridViewPaintParts]::ContentForeground)))
    $color = $e.CellStyle.ForeColor
    if ($sender.Rows[$e.RowIndex].Cells[$e.ColumnIndex].Selected -eq $true){
        $color = $e.CellStyle.SelectionForeColor}

    #Paint text
    [System.Windows.Forms.TextRenderer]::DrawText($e.Graphics, $e.FormattedValue, `
        $e.CellStyle.Font, $e.CellBounds, $color, `
                [System.Windows.Forms.TextFormatFlags]::VerticalCenter -bor `
                [System.Windows.Forms.TextFormatFlags]::TextBoxControl -bor `
                [System.Windows.Forms.TextFormatFlags]::WordBreak -bor `
                [System.Windows.Forms.TextFormatFlags]::EndEllipsis)

    #Event handled, stop default processing
    $e.Handled = $true
}

введите описание изображения здесь

Полный пример

Вот полный рабочий пример PowerShell. Чтобы увидеть эффект, вы можете попробовать изменить размер столбца или строки.

Add-Type -AssemblyName System.Windows.Forms

$form = New-Object System.Windows.Forms.Form
$form.Add_Load({form_Load -sender $form -e $_})

$dgv = New-Object System.Windows.Forms.DataGridView
$dgv.Dock = [System.Windows.Forms.DockStyle]::Fill
$dgv.RowTemplate.Height = 50
$dgv.Add_CellPainting({dgv_CellPainting -sender $dgv -e $_})

$form.Controls.Add($dgv)

Function form_Load {[CmdletBinding()]param( 
    [parameter()] 
    [Object]$sender, 
    [parameter()] 
    [System.EventArgs]$e 
) 
    $dt = New-Object System.Data.DataTable
    $dt.Columns.Add("Column1")
    $dt.Rows.Add("Lorem ipsum dolor sit amet, " + `
        "wisi fierent fabellas pri et, eum aeterno volumus no.")
    $dgv.DataSource = $dt
    #Enable multiline editing
    $dgv.Columns[0].DefaultCellStyle.WrapMode = `
        [System.Windows.Forms.DataGridViewTriState]::True
}

Function dgv_CellPainting{[CmdletBinding()]param( 
    [parameter()] 
    [Object]$sender, 
    [parameter()] 
    [System.Windows.Forms.DataGridViewCellPaintingEventArgs]$e 
) 
    #Don't process if it's not the column which we want or it's a header row
    if (($e.ColumnIndex -ne 0) -or ($e.RowIndex -lt 0)){ return }

    #Paint all parts but text        
    $e.Paint($e.CellBounds, [System.Windows.Forms.DataGridViewPaintParts]::All `
        -band (-bnot([System.Windows.Forms.DataGridViewPaintParts]::ContentForeground)))
    $color = $e.CellStyle.ForeColor
    if ($sender.Rows[$e.RowIndex].Cells[$e.ColumnIndex].Selected -eq $true){
        $color = $e.CellStyle.SelectionForeColor}

    #Paint text
    [System.Windows.Forms.TextRenderer]::DrawText($e.Graphics, $e.FormattedValue, `
        $e.CellStyle.Font, $e.CellBounds, $color, `
                [System.Windows.Forms.TextFormatFlags]::VerticalCenter -bor `
                [System.Windows.Forms.TextFormatFlags]::TextBoxControl -bor `
                [System.Windows.Forms.TextFormatFlags]::WordBreak -bor `
                [System.Windows.Forms.TextFormatFlags]::EndEllipsis)

    #Event handled, stop default processing
    $e.Handled = $true
}

$form.ShowDialog()
$form.Dispose()
person Reza Aghaei    schedule 30.05.2018
comment
Работает абсолютно ИДЕАЛЬНО !! Большое, большое спасибо. Я (ошибочно) подумал, что есть родной способ, не прибегая к изменению раскраски клетки. - person Aldo; 30.05.2018
comment
Пожалуйста :) По крайней мере, я не знаю о встроенном способе, но с использованием пользовательской раскраски это возможно. - person Reza Aghaei; 30.05.2018
comment
Я должен поблагодарить вас еще раз, потому что, помимо решения моей проблемы, вы предоставили отличный код PowerShell ... снова, вам вся моя благодарность - person Aldo; 30.05.2018