如何获取DataGridView Cell当前的字体和样式

时间:2017-03-09 11:51:48

标签: c# winforms datagridview

在DataGridView的CellFormatting或CellPainting事件处理程序中,我设置单元格的Font(粗体)和Color(Fore和Background)。

    private void DataGrid_CellFormatting(object sender,   DataGridViewCellFormattingEventArgs e)
    {
        e.CellStyle.Font = new Font(e.CellStyle.Font, FontStyle.Bold);
        e.CellStyle.ForeColor = Color.White;
        e.CellStyle.BackColor = Color.Black;
    }

    private void DataGrid_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
    {
        e.CellStyle.Font = new Font(e.CellStyle.Font, FontStyle.Bold);
        e.CellStyle.ForeColor = Color.White;
        e.CellStyle.BackColor = Color.Black;
    }

这可以按预期工作,并正确显示所需的字体和颜色。后来我试图从单元格中读取字体和颜色,但它们看起来是空的。

foreach (DataGridViewRow dgvr in dataGrid.Rows)
{
    Font font = dgvr.Cells[0].Style.Font;
    Color foreColor = dgvr.Cells[0].Style.ForeColor;
    Color backColor = dgvr.Cells[0].Style.BackColor;
}

字体始终为空,颜色为空。

它们存放在哪里以及如何访问它们?

2 个答案:

答案 0 :(得分:1)

在请求格式化的方法期间会引发CellFormatting DataGridView控件的事件,例如绘制单元格或获取FormattedValue属性时。您更改的CellStyle将不会应用于单元格,只会用于格式化值和绘画,因此您无法在CellFormatting事件之外找到这些样式。

源代码: DataGridViewCell.GetFormattedValue方法是引发CellFormatting事件的核心方法,如果你看一下方法的源代码,你可以看到您在CellStyle上应用的更改不会存储在单元格中。

解决方案

作为解决问题的选项,您可以在需要时自行引发CellFormatting事件并使用格式化结果。为此,您可以为DataGridViewCell

创建此类扩展方法
using System;
using System.Windows.Forms;
using System.Reflection;
public static class DataGridViewColumnExtensions
{
    public static DataGridViewCellStyle GetFormattedStyle(this DataGridViewCell cell) {
        var dgv = cell.DataGridView;
        if (dgv == null)
            return cell.InheritedStyle;
        var e = new DataGridViewCellFormattingEventArgs(cell.RowIndex, cell.ColumnIndex,
            cell.Value, cell.FormattedValueType, cell.InheritedStyle);
        var m = dgv.GetType().GetMethod("OnCellFormatting",
            BindingFlags.Instance | BindingFlags.NonPublic,
            null,
            new Type[] { typeof(DataGridViewCellFormattingEventArgs) },
            null);
        m.Invoke(dgv, new object[] { e });
        return e.CellStyle;
    }
}

然后你可以这样使用这个方法:

var s = dataGridView1.Rows[].Cells[0].GetFormattedStyle();
var f = s.Font;
var c = s.BackColor;

答案 1 :(得分:0)

var e = new DataGridViewCellFormattingEventArgs(cell.RowIndex, cell.ColumnIndex,
            cell.Value, cell.FormattedValueType, cell.InheritedStyle)

rowindexcolumnIndex 互换,但更改后效果很好