2017-08-15 153 views
2

我有以下代碼:如何修復datagridview錯誤?

private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e) 
{ 
    string age = dataGridView1.Rows[e.RowIndex].Cells["dataGridViewTextBoxColumn43"].Value.ToString(); 

    dataGridView1.Rows[e.RowIndex].Cells["dataGridViewTextBoxColumn43"].Value = (age == "1") ? "Муж" : "Жен"; 
} 

當運行程序它給致命消息:

enter image description here

在數據庫字段genderinteger類型。此值應添加到列名稱:dataGridViewTextBoxColumn43

查詢數據庫:

公共DataTable的選擇(SQLiteDatabase DB) {

return db.GetDataTable("SELECT " + 
     "Pacients.id, " + 
     "unique_code," + 
     "status_pass, " + 
     "payment, " + 
     "profession," + 
     "office_address, " + 
     "factory_name, " + 
     "factory_edrpou, " + 
     "factory_departament," + 
     "name, " + 
     "secondname, " + 
     "lastname, " + 
     "datebirth, " + 
     "taxcode, " + 
     "gender, " + 
     "Pacients.created_at, " + 
     "file, " + 
     "PacientsOrder.kind_work, " + 
     "PacientsOrder.status " + 
     "FROM Pacients LEFT JOIN PacientsOrder ON PacientsOrder.pacient_id = Pacients.id LEFT JOIN Transactions ON Transactions.pacient_id = Pacients.id ORDER BY Pacients.id DESC"); 
} 
+0

您是否調試過代碼?哪一行代碼給你錯誤?代碼討論的是年齡,而你的描述是關於性別的,但是例外是將數字轉換爲字符串的FormatException,而代碼沒有使用任何轉換方法。我在這裏錯過了什麼。 –

+0

它看起來像你試圖分配文本值到綁定到數據源的數字列的單元格。那是轉換失敗的時候。你是否爲列「dataGridViewTextBoxColumn43」設置了特定的數據類型? –

+0

https://stackoverflow.com/questions/13157891/bit-datatype-to-enum-type-mapping-from-database-to-dataset-in-sql-server-2008 – Slai

回答

0

問題是如下因素,它是obvios,但同時並不清楚:

gender字段存儲在數據庫中integer類型。

所以,當我綁定DataGridView與現有的數據庫表它分配建築表的內存定義表的所有屬性,包括單元格類型。

因此,當它第一次發生時,datagridview期望獲取整數數據類型作爲值,但我將值單元格修改爲字符串值並嘗試覆蓋值。

它包含了一個致命的錯誤。

解決方案是將integer的所有數據類型更改爲string類型。

感謝您的回答,它將被接受!

1

如果列ValueTy‌​pe是數字,你可以更改設計的數字格式Муж;;Жен

dataGridView1.Columns["dataGridViewTextBoxColumn43"].DefaultCellStyle.Format = "Муж;;Жен"; 
+0

on type depends? – OPV

+0

@OPV我不確定你的意思。零(0)數字格式爲「'Жен'」,正數字爲「'Муж'」。任何數字有符號,無符號或浮點類型,例如'int','Int64','decimal'都可以工作 – Slai

0

如果我正確理解你,你正嘗試將一個文本值添加到一列,基於一個整數當前在同一列中的值(即,您正在切換列值類型)?

請不要這樣做,因爲它不會有幾個原因。除了你的錯誤之外,最重要的是當你爲你創建的每一行設置DataGridView的DataSource時觸發這個事件,但e.RowIndex並不總是新行的RowIndex。詳細信息請閱讀here

通常,只有在用戶從界面插入新行時纔會使用RowsAdded。

你應該做的是在你的SELECT語句中提供這種轉換,它從數據庫中讀取數據。這樣,您不需要在數據到達DataGridView時轉換數據。所以,你的選擇必須是這樣的:

SELECT .... CASE WHEN gender = 1 THEN 'МУЖ' ELSE 'ЖЕН' END AS gender ... 

編輯

試着改變你的SELECT語句,所以它的內容如下:

public DataTable select(SQLiteDatabase db) { 
    return db.GetDataTable("SELECT " + 
     "Pacients.id, " + 
     "unique_code," + 
     "status_pass, " + 
     "payment, " + 
     "profession," + 
     "office_address, " + 
     "factory_name, " + 
     "factory_edrpou, " + 
     "factory_departament," + 
     "name, " + 
     "secondname, " + 
     "lastname, " + 
     "datebirth, " + 
     "taxcode, " + 
     "CASE WHEN gender = 1 THEN 'МУЖ' ELSE 'ЖЕН' END AS gender, " + 
     "Pacients.created_at, " + 
     "file, " + 
     "PacientsOrder.kind_work, " + 
     "PacientsOrder.status " + 
     "FROM Pacients LEFT JOIN PacientsOrder ON PacientsOrder.pacient_id = Pacients.id LEFT JOIN Transactions ON Transactions.pacient_id = Pacients.id ORDER BY Pacients.id DESC"); 
} 

現在,你可以完全擺脫了添加行活動,因爲數據庫已經完成了你的工作,在它到達datagridview之前。

+0

我在根中不明白問題 – OPV

+0

請顯示從數據庫獲取數據的代碼。 –

+0

我更新了問題 – OPV