Как отключить многоточие текстов ячеек в WindowsForms DataGridView?

У меня есть DataGridView в режиме только для чтения в приложении WinForms .NET 3.5 (Visual Studio 2008).

Ширина ячеек очень мала. Некоторые ячейки содержат короткое число. Теперь даже при мелком шрифте иногда номер показывается через многоточие. Например, "8..." вместо "88".

Есть ли способ, чтобы текст перетекал в следующую ячейку в стандартном DataGridView и избегал многоточия?

Спасибо!


person splattne    schedule 26.05.2009    source источник


Ответы (5)


Я нашел решение, данное здесь KD2ND, неудовлетворительным. Кажется глупым полностью повторно реализовать отрисовку ячеек для такого небольшого изменения - много работы, чтобы справиться с отрисовкой заголовков столбцов и выбранных строк. К счастью, есть более аккуратное решение:

// you can also handle the CellPainting event for the grid rather than 
// creating a grid subclass as I have done here.
protected override void OnCellPainting(DataGridViewCellPaintingEventArgs e)
{
    var isSelected = e.State.HasFlag(DataGridViewElementStates.Selected);

    e.Paint(e.ClipBounds, DataGridViewPaintParts.Background
        //| DataGridViewPaintParts.Border
        //| DataGridViewPaintParts.ContentBackground
        //| DataGridViewPaintParts.ContentForeground
        | DataGridViewPaintParts.ErrorIcon
        | DataGridViewPaintParts.Focus
        | DataGridViewPaintParts.SelectionBackground);

    using (Brush foreBrush = new SolidBrush(e.CellStyle.ForeColor),
        selectedForeBrush = new SolidBrush(e.CellStyle.SelectionForeColor))
    {
        if (e.Value != null)
        {
            StringFormat strFormat = new StringFormat();
            strFormat.Trimming = StringTrimming.Character;
            var brush = isSelected ? selectedForeBrush : foreBrush;

            var fs = e.Graphics.MeasureString((string)e.Value, e.CellStyle.Font);
            var topPos= e.CellBounds.Top + ((e.CellBounds.Height - fs.Height) / 2);

            // I found that the cell text is drawn in the wrong position
            // for the first cell in the column header row, hence the 4px
            // adjustment
            var leftPos= e.CellBounds.X;
            if (e.RowIndex == -1 && e.ColumnIndex == 0) leftPos+= 4;

            e.Graphics.DrawString((String)e.Value, e.CellStyle.Font,
                brush, leftPos, topPos, strFormat);
        }
    }

    e.Paint(e.ClipBounds, DataGridViewPaintParts.Border);
    e.Handled = true;
}

Хитрость заключается в том, чтобы позволить существующему методу `Paint обрабатывать большую часть ячейки. Мы занимаемся только рисованием текста. Граница рисуется после текста, потому что я обнаружил, что в противном случае текст иногда будет закрашиваться поверх границы, что выглядит плохо.

person Oliver    schedule 14.04.2015

В Designer измените свойство DataGridView "RowDefaultCellStyle" -> установите "Wrap Mode" = "true"

person user3756790    schedule 23.10.2014

обрабатывать событие CellPainting элемента управления DataGridView. Проверьте следующую ссылку:

http://msdn.microsoft.com/en-us/library/hta8z9sz.aspx

Обратите внимание, что когда вы рисуете сам текст, вам нужно настроить StringFormat -

цитата из кода MSDN:

if (e.Value != null)
{
    e.Graphics.DrawString((String)e.Value, e.CellStyle.Font,
                    Brushes.Crimson, e.CellBounds.X + 2,
                    e.CellBounds.Y + 2, StringFormat.GenericDefault);
}

Используйте следующий объект StringFormat вместо StringFormat.GenericDefault :

StringFormat strFormat = new StringFormat();
strFormat.Trimming = StringTrimming.None;

С Уважением

person KD2ND    schedule 12.05.2010

Нет, вероятно, есть какое-то свойство для отключения многоточия (если вы получаете доступ к базовым элементам управления), но перетекание (а также слияние ячеек) не поддерживается в стандартном DataGridView.

person MartinStettner    schedule 26.05.2009

Простой метод, который может сработать для вас, — просто включить режим WrapMode для рассматриваемой ячейки.

person Patrick    schedule 06.01.2014