带有&符号的DataGridView CellPainting绘图文本很奇怪

时间:2016-11-22 23:17:18

标签: c# winforms datagridview

我已经实现了一个使用TextRenderer.DrawText的CellPainting事件处理程序,它一直运行良好,直到一个单元格中有一个&符号。单元格在编辑单元格时正确显示&符号,但在完成编辑并绘制它时,它会显示为一条小行(不是下划线)。

Editing cell Not Editing cell

using System;
using System.Drawing;
using System.Windows.Forms;

namespace StackOverFlowFormExample {
    public partial class DataGridViewImplementation : DataGridView {
        public DataGridViewImplementation() {
            InitializeComponent();
            this.ColumnCount = 1;
            this.CellPainting += DGV_CellPainting;
        }

        private void DGV_CellPainting(object sender, DataGridViewCellPaintingEventArgs e) {         
            if (!e.Handled && e.RowIndex > -1 && e.Value != null) {
                e.PaintBackground(e.CellBounds, false);
                TextRenderer.DrawText(e.Graphics, e.Value.ToString(), 
                                      e.CellStyle.Font, e.CellBounds,
                                      e.CellStyle.ForeColor, TextFormatFlags.VerticalCenter);
                e.Handled = true;
            }
        }
    }
}

//creating the datagridview
public partial class MainForm : Form {
    public MainForm() {
        InitializeComponent();  
        DataGridViewImplementation dgvi = new DataGridViewImplementation();
        this.Controls.Add(dgvi);
        dgvi.Rows.Add("this is a & value");
    }
}

替换

TextRenderer.DrawText(e.Graphics, e.Value.ToString(), 
                      e.CellStyle.Font, e.CellBounds, 
                      e.CellStyle.ForeColor, TextFormatFlags.VerticalCenter);

e.PaintContent(e.ClipBounds);

正确显示,当然我希望能够自定义内容的绘画。 我也尝试过使用

e.Graphics.DrawString(e.Value.ToString(), e.CellStyle.Font, Brushes.Black, e.CellBounds);

e.PaintContent Image

但它并没有像

那样绘制它
e.Paint(e.ClipBounds, e.PaintParts);

在绘制一个不需要我自定义绘画的单元格时,我在实际代码中使用了e.Paint。

如何让e.Graphics.DrawString看起来与e.Paint相同或者让TextRenderer.DrawText正确显示&符号?

1 个答案:

答案 0 :(得分:6)

您想使用TextRenderer版本,因为DrawString实际上只能用于打印:

import org.modelmapper.Converter;
import org.modelmapper.spi.MappingContext;

public class ModelMapperTypedStringConverter<T extends TypedString> implements Converter<String, T> {

  @Override
  public T convert(MappingContext<String, T> context) {

    return (T) TypedStringConverter.createNewInstanceFromValue(context.getSource(), context.getDestinationType());
  }
}    

NoPrefix标志将正确显示&符号。