如何在DataGridView中包装没有空格的文本(vb.net / c#)

我已经设置了DataGridView.DefaultCellStyle.WrapMode = DataGridViewTriState.True

但是这个WrapMode不会用单个单词包装没有空格的列.有什么方法可以和WrapMode一起“破解”吗?或任何其他解决方案?

最佳答案 您可以使用CellPainting事件.

DrawString遵循边界Rectangle并在它到达右边界的任何地方进行包装.

您可以取消注释条件以仅应用于超出您设置的限制的单元格.
为了获得最佳控制,您必须测量FormattedValue的长度以找出确切的限制.

如果细胞中有特殊的比对,您可能还需要微调绘制位置.

private void DGV1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
    if (e.Value == null) return;
    if (e.FormattedValue.GetType() != typeof( System.String) ) return;
    bool selected = (e.State & DataGridViewElementStates.Selected) 
                            == DataGridViewElementStates.Selected;
    string s = e.FormattedValue.ToString();

    //if (s.Length > 20) // Apply to all or only those breaking your limits
    {
        e.PaintBackground(e.CellBounds, selected);
        e.Graphics.DrawString(s, DGV1.Font, selected ? 
                   SystemBrushes.HighlightText : SystemBrushes.ControlText, 
                   new Rectangle(e.CellBounds.X + 1, e.CellBounds.Y + 2, 
                                 e.CellBounds.Width - 2, e.CellBounds.Height - 4));
        e.Handled = true;
    }
}

设置Row.Heights取决于您.如果你去测量FormattedValue,你会得到一个RectangleF;所以你也会知道那个Cell的必要高度.将它与当前的Row.Height进行比较,您可以逐渐调整每一行,即每次必要时使其更大..我没有包括,因为它会导致行具有不同的高度,这可能是不需要的/不必要的在你的情况下.如果您有兴趣,我可以发布代码,但..

点赞