在/显示表单之前在DataGridView上设置单元格字体

时间:2012-04-20 18:42:27

标签: c# datagridview

背景

当我点击WinForm上的按钮时,我将数据加载到BindingSource中,该BindingSource充当DataGridView的数据源。加载数据后,我会对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中,我可以制作字体,但这对我来说似乎有些过分,因为我只需要在加载表单时运行一次 - 如果进程运行之后它可以正常工作表格可见。

恳求

如果有人有任何建议,我将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:1)

对于您正在使用的事件处理程序,我建议使用像@zimdanen这样的dataGridView Cell_Formatting。但是,这就是我的工作方式。

    private void small8PtToolStripMenuItem_Click(object sender, EventArgs e)
    {
        fontSize = 8;
        dataGridBatchHistory.Refresh();
    }

fontSize是一个用于动态设置字体的整数,您可以通过这种方式设置大多数属性。比我称之为我的CellFormatting功能

    private void dataGridBatchHistory_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
    {
        e.CellStyle.Font = new Font("Tahoma", fontSize);
    }

这将在单击我的工具条菜单项时使用新的正确大小更新我的表单。但我相信这适用于您可以创建的许多活动!

答案 1 :(得分:0)

我想,由于缺乏回复,如果您希望在表单首次显示时显示格式,则没有更好的方法。我删除了Show NULL values处理程序的btnFetch_Click部分并添加了此dgvMessageTracking_CellFormatting处理程序以始终处理此功能:

private void dgvMessageTracking_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    if (e.Value is DBNull)
    {
        e.Value = "NULL";
        e.CellStyle.Font = new Font(dgvMessageTracking.DefaultCellStyle.Font, FontStyle.Italic);
    }
}