2011-01-20 2 views
22

Я хотел бы манипулировать ячейкой в ​​моем DataGridView, когда он проверяет, чтобы, если пользователь вводит значение, которое недопустимо для базы данных, но легко преобразуется в действительные данные, программа будет измените значение на соответствующее.Проверка и изменение значения DataGridView

Я могу проверить правильность моего значения, но когда я пытаюсь изменить его на что-то действительное, я получаю DataError. Вот мой код:

 private void unit_List_2_GroupsDataGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) 
    { 
     Console.WriteLine("Validating"); 
     DataGridViewColumn col = this.unit_List_2_GroupsDataGridView.Columns[e.ColumnIndex]; 
     DataGridViewCell cell = this.unit_List_2_GroupsDataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex]; 
     if (col == this.batchDataGridViewTextBoxColumn && this.unit_List_2_GroupsDataGridView.IsCurrentCellInEditMode) 
     { 
      Console.WriteLine(" Batch Column"); 
      DataRow[] rows = label_EntryDataSet.viewJobBatchList.Select(String.Format("Job={0} AND Display='{1}'" 
       , comboBox1.SelectedValue, e.FormattedValue)); 
      if (rows.Length == 1) 
      { 
       Console.WriteLine("  Auto Completed item from list: {0}", rows[0]["Batch"]); 
       //e.Cancel = true; 
       cell.Value = rows[0]["Batch"]; 
       //this.unit_List_2_GroupsDataGridView.EndEdit(); 
      } 
      else 
      { 
       Console.WriteLine("  No Autocomplete!"); 
       int i = 0; 
       if (!int.TryParse(e.FormattedValue.ToString(), out i)) 
       { 
        Console.WriteLine("   Not an integer either"); 
        e.Cancel = true; 
       } 
      } 
     } 
    } 

линия, которая считывает cell.Value = строка [0] [ "Batch"]; не делает то, что я ожидаю от него.

+0

Пожалуйста, сообщите точное сообщение об ошибке и укажите, какая строка кода указана. – David

ответ

39

Событие CellValidating происходит непосредственно перед тем, как DataGridView покидает режим редактирования; это событие, которое относится к/включает в себя управление редактированием (DataGridView.EditingControl). Вы никогда не должны пытаться изменить значение ячейки в обработчике для этого события, потому что, если вы не отмените событие (в этом случае пользователь застрял в режиме редактирования), значение ячейки устанавливается в значение из элемента управления редактирования сразу после завершение события. Поэтому это отменяет любое действие, выполняемое в обработчике.

Вместо этого вы должны изменить значение в элементе управления редактированием (помните, чтобы не отменять событие). Например, для DataGridViewTextBoxCell, можно использовать следующие вместо проблемной линии:

unit_List_2_GroupsDataGridView.EditingControl.Text = Convert.ToString(rows[0]["Batch"]); 

Вы должны найти, что это решает проблему.

+0

Это действительно решило мою проблему. Большое спасибо. – Micah

+0

И мой. Спасибо. –

+0

Просто то, что мне нужно, спасибо! –

3

В общем случае лучше использовать событие CellParsing всякий раз, когда вам нужно преобразовать/изменить значение в ячейке. Из этого события вы можете указать, что значение пользователя неверно, установив значение ячейки или строки ErrorText.

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