背景
当我点击 WinForm 上的按钮时,我将数据加载到用作 DataGridView 数据源的 BindingSource 中。加载数据后,我对 DataGridView 进行一些修改;特别是,我 1) 将任何值为 DBNull 的单元格设置为字符串值“NULL”,2) 将相同的单元格设为斜体,以及 3) 突出显示某些行。
我正在做的简单示例:
private void btnFetch_Click(object sender, EventArgs e)
{
// If there's already a DataSource, Dispose of it.
if (bsMessageTracking.DataSource != null)
{
(bsMessageTracking.DataSource as DataTable).Dispose();
}
// Get new DataSource.
bsMessageTracking.DataSource = GetDataTable(); // Details not relevant.
// Show NULL values.
foreach (DataGridViewRow row in dgv.Rows)
{
foreach (DataGridViewCell cell in row.Cells)
{
if (cell.Value is DBNull)
{
cell.Value = "NULL";
cell.Style.Font = new Font(dgv.DefaultCellStyle.Font, FontStyle.Italic);
}
}
}
// Apply highlighting.
foreach (DataGridViewRow row in dgvMessageTracking.Rows)
{
if (HighlightRow(row)) // Details not relevant.
{
row.DefaultCellStyle.BackColor = Color.LightYellow;
}
}
}
数据根据输入到表单上的 TextBox 中加载。
情况
如果在单击按钮时发生这种情况,一切都会很好。但是,为了给用户提供一些便利,我允许这个表单加载预填充的数据——主表单将用要放入 TextBox 的数据实例化这个表单,并且这个 btnFetch_Click 处理程序将从构造函数中调用:
internal MessageTracking(string ID)
{
InitializeComponent();
// Setup data source.
dgvMessageTracking.DataSource = bsMessageTracking;
// Set ID and run query.
if (ID != null)
{
// Set ID.
txtlID.Text = ID;
// Run!
btnFetch_Click(null, null);
}
}
单元格的值发生了变化(所以我看到 NULL),但字体和突出显示不粘。
我试过的
如果我在 OnShown 方法中复制突出显示代码,突出显示会粘住。但是,在那里复制字体代码是行不通的。如果我把它放在 CellFormatting 中,我可以让字体保持不变,但这对我来说似乎有点过头了,因为我只需要在加载表单时运行一次 - 如果在表单可见后运行进程,它就可以正常工作。
恳求
如果有人有任何建议,我将不胜感激。谢谢!