2014-11-05 74 views
6

我甚至沒有想法在哪裏尋找解決這個錯誤。 最近我得到以下異常,我點擊後在DataGridViewCheckBoxColumn複選框進行檢查,並離開該細胞:DataGridViewCheckBoxColumn:布爾列上的FormatException

System.FormatException:「」不是有效的布爾

下面是完整的從DataGridView錯誤對話框:

enter image description here

我甚至不知道我能勝任找到原因哪一個事件這個問題。 ValidatingCellFormatting事件在錯誤發生之前觸發,但都通過。 如果我處理DataError-事件我仍然無法弄清楚。該DataGridViewDataErrorEventArgs參數包含以下信息(其中包括):

e.ColumnIndex = 0 
e.RowIndex = 0 
e.Context  = Commit 

完整的異常(e.Exception.ToString())是:

System.FormatException:不是布爾有效值。 ---> System.FormatException:String未被識別爲有效的布爾值。 在System.Boolean.Parse(字符串值) System.ComponentModel.BooleanConverter.ConvertFrom(ITypeDescriptorContext 上下文,CultureInfo的文化,對象的值)---內 異常堆棧跟蹤的末尾在 System.ComponentModel。 BooleanConverter.ConvertFrom(ITypeDescriptorContext 上下文,CultureInfo的文化,對象值) System.ComponentModel.TypeConverter.ConvertFrom(對象值) System.Windows.Forms.DataGridView.DataGridViewDataConnection.PushValue(的Int32 boundColumnIndex,的Int32 columnIndex,的Int32 rowIndex位置,對象值)

以下是有關列屬性的截圖,列有ThreeState=falseFalseValue沒有指定,TrueValueIndeterminateValue

enter image description here

BindingSource的數據源是一個List<ErpService.ArrivalChargeAssignment>其中ArrivalChargeAssignment是一類從我的WCF web服務與bool -field IsAssigned,所以它永遠不可能是null(甚至是一個空字符串)。

+0

我記得當我們的團隊在做一個遺留項目時發生這樣的錯誤(儘管不完全一樣)。事實證明,出現了某種競爭狀況 - 數據源正在被多個不同的線程改變/讀取,控制器不喜歡它。我們花了很多時間在上面,但無法弄清楚是什麼導致了它(鎖也沒有幫助)。我們最終放棄了WinForms並轉向WPF。可能不是你正在尋找的答案,但如果它是一個全新的項目,它將是值得的寫在WPF。 – PoweredByOrange 2014-11-05 15:47:08

+3

每當DGV嘗試格式化指定數據類型格式的值時,我也會收到相同的錯誤。我無法解決這個問題。所以,我處理了'DataError'事件以避免這種異常。 – Shell 2014-11-06 04:36:03

+0

@Nimesh:是的,也許我也會吞下這個異常,儘管如果我不知道原因,我不喜歡忽略異常。 – 2014-11-06 09:00:00

回答

7

好吧,我已經做了一些測試與Windows窗體設計器,我發現一些代碼生成奇怪。所以,我在測試中做了什麼是

首先,我添加了一個包含DataGridViewCheckBoxColumn類型的列,並用數據表填充了datagridview。我添加了一些空值的記錄。

現在,它工作正常,數據正確顯示,也沒有給出任何錯誤。 然後我改變了DefaultCellStyleCheckedBoxColumn的屬性,並從Nullvalue屬性中刪除了False值,並重新啓動它。 現在,應用程序正在顯示該錯誤。

我回到DefaultCellStyle屬性,並設置False值回來。然後我再次運行該項目。但是,它仍然向我展示了同樣的錯誤。

因此,加載了Form.designer.cs文件並檢查了dataGridViewCellStyle1對象。在那裏我發現該屬性設置爲字符串類型值"False"而不是布爾類型false

dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; 
dataGridViewCellStyle1.NullValue = "False"; 
this.Column1.DefaultCellStyle = dataGridViewCellStyle1; 
this.Column1.HeaderText = "Check Box"; 
this.Column1.Name = "chkCol"; 

所以,我已經更新了這一行如下,並再次啓動項目。現在,錯誤消失了。

dataGridViewCellStyle1.NullValue = false; 

當我創建了DataGridViewCheckBoxColumn我發現,有沒有對象被默認單元格樣式屬性創建。因此,默認NullValue屬性值爲false值。但是在修改該屬性之後,該對象已經創建並且該屬性被分配了字符串類型值。

已更新:只需重新創建該列即可解決此問題。

+1

非常感謝。奇怪的是,我還沒有嘗試重新創建應該是MS產品的第一個動作的列(重新啓動);)再次感謝。 – 2014-11-06 10:30:05

+0

尼斯答案,精確寫作 – Mohit 2014-11-06 10:38:30

+1

歡迎@TimSchmelter,總是樂於助人,今天我也學到了一些新東西。 – Shell 2014-11-06 10:40:00

0

使用這種可使用全

private void DataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e) 
     { 
      DataGridView1["Your Column Index", e.RowIndex].Value = Convert.ToBoolean(DataGridView1["Your Column Index", e.RowIndex].Value); 
     } 

private void DataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) 
     { 
      if (Convert.ToBoolean(DataGridView1["Your Column Index", e.RowIndex].Value)) 
      { 
       DataGridView1["Your Column Index", e.RowIndex].Value = false; 
      } 
      else 
      { 
       DataGridView1["Your Column Index", e.RowIndex].Value = true ; 
      } 
     } 
0

你也可以做一件事。在創建網格時,可以分配布爾值「true」或false(如下所示)。在上面的問題中,列索引是0,並且可以在創建網格時訪問rowindex。你不會得到這個錯誤。我面臨同樣的問題,並解決它,如下所示。也欣賞其他2個答案。

DataGridViewCell oCell; 
oCell = dataGridView["Your Column Index", "Your Row index"]; 
oCell.Value = false; 
0

我只是解決它在一個優雅的方式,如果你的數據庫列類型是布爾(「」)和你的DataGridView 的AutoGenerateColumns是真實的,那麼DataGridViewCheckBoxColumn就會產生,因此所有你需要做的是改變默認的真值和假值以及數據類型。

通用代碼解決問題,數據源assingment後插入:

foreach (DataGridViewColumn dc in DataGridView1.Columns) 
{ 
    if (dc.ValueType == typeof(Boolean)) 
    { 
     dc.ValueType = typeof(Int32); 
     ((DataGridViewCheckBoxColumn)dc).DefaultCellStyle.NullValue = 0; 
     ((DataGridViewCheckBoxColumn)dc).TrueValue = 1; 
     ((DataGridViewCheckBoxColumn)dc).FalseValue = 0; 
    } 
} 
0

我掙扎着同樣的問題,有一個簡單的解決方法,而無需編寫任何代碼。

問題不在於「TrueValue」或「FalseValue」參數,並且您不需要捕獲錯誤處理程序。簡而言之,問題是DataGridView對象添加一個新行(因此在初始繪製期間觸發錯誤),但問題的根源在於新行中的數據尚未初始化,因此它是「不確定的「....所以只需爲」IndeterminateValue「設置一個默認值,而不要將其留空。