2013年4月25日 星期四

[除錯] System.ArgumentException:DataGridViewComboBoxCell 值無效 (2)

程式碼:
        Me.DataGridView1.AutoGenerateColumns = False
        Me.DataGridView1.DataSource = dt

        Dim installs(dt供應商.Rows.Count - 1) As String
        Dim x As Integer = 0
        For Each dr As DataRow In dt供應商.Rows
            installs(x) = dr(0).ToString
            x += 1
        Next

        '供應商
        Dim columnSex As New DataGridViewComboBoxColumn()
        columnSex.HeaderText = "供應商別"
        columnSex.Name = "供應商別"
        columnSex.DataPropertyName = "供應商別"
        columnSex.ValueType = GetType(String)  'dt供應商.Rows(0).Item(0).GetType()
        columnSex.Items.AddRange(installs)
        DataGridView1.Columns.AddRange(New System.Windows.Forms.DataGridViewColumn() {columnSex})

原因:
出现这种问题有两种原因:
1.数据类型不匹配 
2.所赋数据项与绑定的数据源中数据不符 结贴!

此次debug為第二種原因:
資料庫某一個Record的其供應商別的欄位的值為 X
而DataGridViewComboBoxColumn的Items的值為 Y,Z,S 不包含X


解決(一):
繫結資料庫dt時,必須確定資料庫的值可與DataGridViewComboBoxColumn的Items匹配。
只要把資料庫的值改掉就好。 也就是說必須確定資料庫的值不會是Items匹配以外的值。

解決(二):
直接在事件處理掉 ""DataGridView1_DataError""
就不會出現錯誤訊息,只要不影響作業!
但是若資料庫的數值型態與.NET數值型態不符時,雖然錯誤訊息已隱藏!
但當在選擇items時,會無法正常運作。
即使你選擇了某值,而此值因為違反規則,所以又會變成空白...

Private Sub DataGridView1_DataError(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewDataErrorEventArgs) Handles DataGridView1.DataError
        'e.ThrowException = False

        'If Me.DataGridView1.Columns(e.ColumnIndex).Name = "供應商別" Then
               'do something here
               '留空, 只要輸入符合欄位型態,(為繫結資料來源內的項目)可正常輸入!
        'End If

End Sub
可參考(DataGridViewComboBoxColumn的数据源有关问题)
DataGridViewDataErrorContexts 列舉型別

圖示:
原始資料(From DataBase)
紅色部份為不存在於繫結來源內的項目


沒有加入事件 DataGridView1_DataError (在AA03 就開始出現錯誤訊息...)

加入事件 DataGridView1_DataError

選擇來源為資料繫結內的項目-001

選擇來源為繫結資料內的項目-002

輸入自定義文字-001

輸入自定義文字-002 ∵不符合原始繫結資料內的項目,故還原為空白!


參考:
C# 類型的預設值 (C# 參考)  string就不會出錯,但數值有預設值,所以會出錯...

Datagridview ComboBoxColumn Nullable
DataGridViewComboBoxCell.GetFormattedValue 方法
给DataGridViewComboBoxCell赋值的问题!
DataGridViewComboBoxColumn值无效
DataGridViewComboBoxColumn值无效
解决方法就是在窗体的构造函数里添加如下代码:
this.dataGridView1.DataError += delegate(object sender, DataGridViewDataErrorEventArgs e) { };

DataGridViewComboBoxColumn的使用 (高招)
Mapping CLR Parameter Data
DataGridView 使用问题
DataGridView.DataError 事件
Non-String values in DataGridViewComboBoxColumn causing DataErrors in DataGridView
System.ArgumentException:DataGridViewComboBoxCell 值無效 (1)
DataGridViewComboBoxCell 值無效
DataGridView中comboBox数据绑定的问题
DataGridView 的DataGridViewComboBoxColumn 無效值問題

SqlServer中decimal(numeric )、float 和 real 数据类型的区别
What is a good mapping of .NET decimal to SQL Server decimal?


沒有留言:

張貼留言