好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

在WinForms的DataGridView控件中CellFormatting事件的刷新单元格及使用

在WinForms的DataGridView控件中CellFormatting事件的刷新单元格及使用说明

在WinForms的DataGridView控件中,CellFormatting事件确实会在每次需要显示单元格的内容时触发,但这并不意味着它会对每一列都单独进行遍历。实际上,CellFormatting事件是针对单个单元格的格式化操作的。当你为DataGridView设置了CellFormatting事件的处理函数时,每次有单元格需要显示其内容时,该事件就会被触发。

事件触发机制

触发时机:当DataGridView尝试显示某个单元格的内容时,会触发CellFormatting事件。这通常发生在滚动、数据绑定更新或者调用Refresh方法时。

参数:CellFormatting事件的处理函数接收三个参数:sender(触发事件的控件,即DataGridView本身),e(包含事件数据的DataGridViewCellFormattingEventArgs对象)。通过这个参数,你可以访问到将要被格式化的单元格(e.CellStyle)和单元格的值(可以通过e.Value访问)。

示例

假设你有一个DataGridView控件,并且你想要在显示某些列的数据时改变它们的格式,你可以这样设置CellFormatting事件:

DataGridView1.CellFormatting += DataGridView1_CellFormatting;

dataGridView1.CellFormatting += new DataGridViewCellFormattingEventHandler(dataGridView1_CellFormatting);

private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)

{

    // 检查是否为特定的列

    if (e.ColumnIndex == 2) // 假设我们想要格式化第三列

    {

        // 设置单元格的格式

        if (e.Value != null && !Convert.IsDBNull(e.Value))

        {

            e.Value = string.Format("{0:C}", e.Value); // 例如,格式化为货币形式

            e.FormattingApplied = true; // 标记格式已应用,避免默认格式化

        }

    }

}

性能注意事项

虽然对于单个单元格的格式化操作通常不会对性能产生显著影响,但如果你的处理逻辑非常复杂或者在大量数据的情况下频繁触发(例如,在数据频繁更新的情况下),则可能会影响性能。在这种情况下,考虑以下优化方法:

延迟更新:使用BeginUpdate和EndUpdate方法包围你的更新代码,以减少重绘次数。

条件检查:只在确实需要格式化时才应用格式,避免不必要的计算。

批处理:如果可能,将多个更新操作合并为一次处理。

通过合理利用这些技术和注意事项,你可以有效地管理DataGridView的CellFormatting事件,从而优化性能和用户体验。

比如:

        private void DataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)

        {

            if ((e.RowIndex >= 0) && (e.ColumnIndex >= 0))

            {

                if (DataGridView1.Columns[e.ColumnIndex].Name.Equals("unitid"))

                {

                    units m = _units.Find(p => p.id.ToString() == e.Value.ToString().Trim());

                    if (m != null)

                        e.Value = m.name;

                }

                if (DataGridView1.Columns[e.ColumnIndex].Name.Equals("brandid"))

                {

                    brands m = _brands.Find(p => p.id.ToString() == e.Value.ToString().Trim());

                    if (m != null)

                        e.Value = m.name;

                }

                if (DataGridView1.Columns[e.ColumnIndex].Name.Equals("typeid"))

                {

                    celltype m = _celltypes.Find(p => p.id.ToString() == e.Value.ToString().Trim());

                    if (m != null)

                        e.Value = m.name;

                }

            }

        }


查看更多关于在WinForms的DataGridView控件中CellFormatting事件的刷新单元格及使用的详细内容...

  阅读:20次