DatagridView:在任何单元格的每个“onmouseenter”上,都会引发cellFormatting事件?

时间:2009-11-22 03:41:26

标签: c# visual-studio-2008 datagridview

我有一个Datagridview,我需要在某些行上验证用户输入,并根据它的值进行更改。例如,如果用户输入了数据库中不存在的产品代码,则搜索产品对话框会引发并搜索产品并返回正确的代码。 所以经过大量阅读后,我决定处理CellFormating事件:但我遇到了两个问题:

  1. e.value使用正确的值设置,但不会保留
  2. 事件被提升了数百万次,有时会遇到SO异常。
  3. 这就是为什么我把mbox放在事件处理程序中,现在程序什么都不做,只显示mbox。

    这里的要点是,即使表格是新创建的,事件也会引发很多,每当我将mose指针移到任何单元格上时,事件都会再次出现。

    这里最好的选择是什么? bellow是事件处理程序中的代码:

    void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            try
            {
                if (e.ColumnIndex == 0 && !dataGridView1.Rows[e.RowIndex].IsNewRow)
                {
                    if (!Rep.Cajero_ProductoExiste(double.Parse(e.Value.ToString())))
                    {
                        BuscarEIngresarProducto(ref e);
                    }
                }
                MessageBox.Show("Event handler raised");
            }
            catch
            {
                e.FormattingApplied = false;
            }
    
        }
    

    Rep.Cajero_ProductoExiste是一种方法,如果产品存在,则返回bool = true,方法BuscarEIngresarProducto()如下:

    private void BuscarEIngresarProducto(ref  DataGridViewCellFormattingEventArgs e)
        {
            Busqueda b = new Busqueda(Rep, 2);
            if (b.ShowDialog() == DialogResult.OK)
            {
                e.Value = b.ProductoCodigo;
                dataGridView1.CurrentRow.Cells["pk"].Value = b.Producto;
                e.FormattingApplied = true;
            }
        }
    

    任何帮助都将得到帮助。在此先感谢(PD:对不起4我的英语,我是西班牙语的说话者)

1 个答案:

答案 0 :(得分:1)

您可以尝试处理CurrentCellDirtyStateChanged并检查IsCurrentCellDirty属性。如果是真的 - 验证输入。