2009-11-22 2 views
0

У меня есть Datagridview, на котором мне нужно проверить ввод пользователя на строки certains и изменить его в соответствии с его значением. Например, если пользователь вводит код продукта, который не существует в БД, поиск диалогового окна продукта вызывает поиск и поиск продукта и возвращает правильный код. Таким образом, после прочтения вокруг много, я решил обработать событие CellFormating: но я столкнулся с двумя проблемами:DatagridView: на каждом «onmouseenter» в любой ячейке возникает событие cellFormatting?

  1. e.value выставиться с правильным значением, но оно не сохраняется
  2. И событие поднимается как миллионы раз, а иногда сталкивается с исключением SO.

И вот почему я поставил mbox в обработчик событий, и теперь программы ничего не делают, кроме как показывает это mbox.

Дело в том, что даже когда формы создаются вновь, событие много поднимается, и каждый раз, когда я перемещаю указатель мыши на любую ячейку, событие снова поднимается.

Какой здесь вариант? ниже приведен код внутри обработчика событий:

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 это метод, который возвращает логическое значение = 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; 
     } 
    } 

Любая помощь будет быть aprecciated. Спасибо заранее (PD: извините 4 мой английский, я испанский болтун)

ответ

1

Вы можете попробовать обработать CurrentCellDirtyStateChanged и проверить свойство IsCurrentCellDirty. Если это правда - подтвердите ввод.

+0

Спасибо! Есть способ tooo многих событий в datagridview, поэтому я думаю, что я должен начать читать многие из них. – josecortesp

Смежные вопросы