vb.net在单元格中的第一个字符

时间:2012-08-06 12:27:02

标签: vb.net datagridview colors char

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

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

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

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

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

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:0)

我做了类似的事情,最后将这些字符放在他们自己的专栏中。