如何在WindowsForms DataGridView中禁用单元文本的省略号?

时间:2021-11-27 14:45:20

I have a DataGridView in readonly mode in a .NET 3.5 (Visual Studio 2008) WinForms application.

我在。net 3.5 (Visual Studio 2008) WinForms应用程序中有一个readonly模式的DataGridView。

The cells' width is very small. Some of the cells contain a short number. Now, even with a small font, sometimes the number is shown with an ellipsis. For example "8..." instead of "88".

细胞的宽度很小。有些单元格包含一个简短的数字。现在,即使使用小字体,有时也会使用省略号来显示数字。例如“8…”而不是“88”。

Is there a way to let the text flow over the next cell in a standard DataGridView and avoid the ellipsis?

是否有一种方法可以让文本在标准DataGridView中的下一个单元格上流动,并避免省略?

Thanks!

谢谢!

5 个解决方案

#1


2  

I found the solution given here by KD2ND to be unsatisfying. It seems silly to fully re-implement cell painting for such a small change - it's lots of work to handle painting of column headers & selected rows too. Luckily there is a neater solution:

我发现kd2给出的解并不令人满意。对于如此小的更改,完全重新实现单元格绘图似乎很愚蠢——处理列标题和所选行的绘图也需要大量的工作。幸运的是,有一个更整洁的解决方案:

// 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;
}

The trick is to let the existing `Paint method handle the painting of most of the cell. We only handle painting the text. The border is painted after the text because I found that otherwise, the text would sometimes be painted over the border, which looks bad.

诀窍是让现有的“绘图方法”处理大部分单元的绘图。我们只处理文字。边框是在文本后面绘制的,因为我发现如果不这样,文本有时会被画在边框上,这看起来很糟糕。

#2


3  

handle the DataGridView control's CellPainting event. Check the following link :

处理DataGridView控件的CellPainting事件。查看以下链接:

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

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

Note that when you draw the text itself you need to customize the StringFormat -

请注意,当您绘制文本本身时,您需要自定义StringFormat -

quote from the MSDN code :

引用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);
}

Use the following StringFormat object instead of StringFormat.GenericDefault :

使用以下的StringFormat对象而不是StringFormat。GenericDefault:

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

Regards

问候

#3


1  

No, there's probably some property to disable the ellipsis (if you access the underlying controls), but flow over (and also cell merging) is not supported in the standard DataGridView.

不,可能有一些属性可以禁用省略号(如果您访问底层控件),但是在标准的DataGridView中不支持流(以及单元格合并)。

#4


1  

In Designer change DataGridView Property "RowDefaultCellStyle" -> set "Wrap Mode" = "true"

在Designer change DataGridView属性“RowDefaultCellStyle”—>设置“Wrap Mode”=“true”

#5


0  

A simple technique that might work for you is just to turn WrapMode for the cell in question

一种可能对您有用的简单技术是为相关的单元格打开包装模式

#1


2  

I found the solution given here by KD2ND to be unsatisfying. It seems silly to fully re-implement cell painting for such a small change - it's lots of work to handle painting of column headers & selected rows too. Luckily there is a neater solution:

我发现kd2给出的解并不令人满意。对于如此小的更改,完全重新实现单元格绘图似乎很愚蠢——处理列标题和所选行的绘图也需要大量的工作。幸运的是,有一个更整洁的解决方案:

// 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;
}

The trick is to let the existing `Paint method handle the painting of most of the cell. We only handle painting the text. The border is painted after the text because I found that otherwise, the text would sometimes be painted over the border, which looks bad.

诀窍是让现有的“绘图方法”处理大部分单元的绘图。我们只处理文字。边框是在文本后面绘制的,因为我发现如果不这样,文本有时会被画在边框上,这看起来很糟糕。

#2


3  

handle the DataGridView control's CellPainting event. Check the following link :

处理DataGridView控件的CellPainting事件。查看以下链接:

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

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

Note that when you draw the text itself you need to customize the StringFormat -

请注意,当您绘制文本本身时,您需要自定义StringFormat -

quote from the MSDN code :

引用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);
}

Use the following StringFormat object instead of StringFormat.GenericDefault :

使用以下的StringFormat对象而不是StringFormat。GenericDefault:

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

Regards

问候

#3


1  

No, there's probably some property to disable the ellipsis (if you access the underlying controls), but flow over (and also cell merging) is not supported in the standard DataGridView.

不,可能有一些属性可以禁用省略号(如果您访问底层控件),但是在标准的DataGridView中不支持流(以及单元格合并)。

#4


1  

In Designer change DataGridView Property "RowDefaultCellStyle" -> set "Wrap Mode" = "true"

在Designer change DataGridView属性“RowDefaultCellStyle”—>设置“Wrap Mode”=“true”

#5


0  

A simple technique that might work for you is just to turn WrapMode for the cell in question

一种可能对您有用的简单技术是为相关的单元格打开包装模式