在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;
}
字体始终为空,颜色为空。
它们存放在哪里以及如何访问它们?
答案 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)
rowindex
和 columnIndex
互换,但更改后效果很好