2

背景

当我点击 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 中,我可以让字体保持不变,但这对我来说似乎有点过头了,因为我只需要在加载表单时运行一次 - 如果在表单可见后运行进程,它就可以正常工作。

恳求

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

4

2 回答 2

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);
    }

单击我的工具条菜单项后,这将使用新的正确大小更新我的表单。但是我相信这适用于您可以创建的许多事件!

于 2012-08-08T20:32:37.607 回答
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);
    }
}
于 2012-04-25T12:50:08.433 回答