Как отключить многоточие текстов ячеек в WindowsForms DataGridView? - PullRequest
6 голосов
/ 26 мая 2009

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

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

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

Спасибо!

Ответы [ 5 ]

3 голосов
/ 24 октября 2014

В конструкторе измените свойство DataGridView "RowDefaultCellStyle" -> установите "Режим обтекания" = "true"

3 голосов
/ 12 мая 2010

обрабатывает событие 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;

Привет

2 голосов
/ 14 апреля 2015

Я нашел решение, данное здесь 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 обрабатывать рисование большей части ячейки. Мы занимаемся только рисованием текста. Граница закрашивается после текста, потому что я обнаружил, что в противном случае текст иногда закрашивается поверх границы, что выглядит плохо.

1 голос
/ 26 мая 2009

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

0 голосов
/ 06 января 2014

Простая техника, которая может работать для вас, это просто включить WrapMode для рассматриваемой ячейки

...