1

在 VB .NET 中,我根据某些计算将 3 个字符添加到 DataGridView 单元格中。

它们是等级变化箭头并且工作正常,但我希望向上箭头为绿色,向下箭头为红色。

Dim strup As String = "▲"
Dim strdown As String = "▼"
Dim strsame As String = "▬"

因此,在单元格中,负 3 的变化看起来像 ▼3,加 3 看起来像 ▲3,其中文本和符号是不同的颜色。

如何更改 DataGridView 单元格中第一个字符的颜色?

4

2 回答 2

2

如果您在单元格中除了有问题的角色之外还有其他任何内容(您需要进行某种形式的自定义绘画),则没有简单的方法可以做到这一点。

如果您只有这些字符,那么使用 CellFormatting 事件很容易:

void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    e.CellStyle.Font = new Font("Arial Unicode MS", 12);
    if (dataGridView1.Columns[e.ColumnIndex].Name == "CorrectColumnName")
    {
        if (e.Value == "▲")
            e.CellStyle.ForeColor = Color.Green;
        else if (e.Value == "▼")
            e.CellStyle.ForeColor = Color.Red;
        else
            e.CellStyle.ForeColor = Color.Black;
    }
}

如果您确实想要在同一个单元格中使用不同的颜色,则需要类似以下代码(这将处理 CellPainting 事件):

void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
    if (e.ColumnIndex == -1 || e.RowIndex == -1)
        return;

    if (dataGridView1.Columns[e.ColumnIndex].Name == "CorrectColumnName")
    {
        e.Paint(e.CellBounds, DataGridViewPaintParts.All & ~DataGridViewPaintParts.ContentForeground);

        if (e.FormattedValue.ToString().StartsWith("▲", StringComparison.InvariantCulture))
        {
            RenderCellText(Color.Green, e);
        }
        else if (e.FormattedValue == "▼")
        {
            RenderCellText(Color.Red, e);
        }
        else
            RenderCellText(SystemColors.WindowText, e);

        e.Handled = true;
    }
}

private void RenderCellText(Color color, DataGridViewCellPaintingEventArgs e)
{
    string text = e.FormattedValue.ToString();
    string beginning = text.Substring(0, 1);
    string end = text.Substring(1);
    Point topLeft = new Point(e.CellBounds.X, e.CellBounds.Y + (e.CellBounds.Height / 4));

    TextRenderer.DrawText(e.Graphics, beginning, this.dataGridView1.Font, topLeft, color);
    Size s = TextRenderer.MeasureText(beginning, this.dataGridView1.Font);

    Point p = new Point(topLeft.X + s.Width, topLeft.Y);
    TextRenderer.DrawText(e.Graphics, end, this.dataGridView1.Font, p, SystemColors.WindowText);
}
于 2012-08-06T13:09:01.983 回答
0

我曾经做过类似的事情,最后把这些字符放在自己的列中。

于 2012-08-06T12:34:33.260 回答