2011-01-20 323 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] [ 「批量」];沒有做我期望的事情。

+0

請發佈確切的錯誤消息,並指出哪一行代碼被提及。 – David 2011-01-20 02:50:46

回答

39

CellValidating事件發生在DataGridView離開編輯模式之前;這是涉及編輯控件的事件(DataGridView.EditingControl)。您不應該嘗試更改此事件的處理程序中的單元格值,因爲除非您取消該事件(在這種情況下用戶處於編輯模式),否則單元格值將設置爲緊跟在該事件之後的編輯控件的值事件結束。因此,這撤消了您在處理程序中執行的任何操作。

你必須做的是改變編輯控件的值(記住不要取消事件)。例如,對於一個DataGridViewTextBoxCell,你可以使用以下的,而不是你的問題的行:

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

你應該找到解決您的問題。

+0

這確實解決了我的問題。非常感謝你。 – Micah 2011-01-20 20:41:21

3

通常,無論何時需要轉換/更改單元格中的值,最好使用CellParsing事件。在該事件中,您可以通過設置單元格或行的ErrorText值來指示用戶的值無效。

相關問題