我想从手动输入数据“C|贷方,D|借方”的选定组合框项目中存储 C 和 D。以下是我的代码
FillCombosWithValueMDisplayM(m01OpnCrDr, "C|Credit,D|Debit")
'在form_load中调用
但是当我从表单上的各种控件收集数据时,组合框返回“Nothing”。
我尝试了以下编码
以下子手动填充数据到组合是在公共模块中:
Sub FillCombosWithValueMDisplayM(CtrlCombo As ComboBox, CommaSepVDPair As String)
Dim pairs() = CommaSepVDPair.Split(",")
For Each pair As String In pairs
Dim KeyVal() = pair.Split("|")
Dim newItem As New With {.Value = KeyVal(0).ToString, .Display = KeyVal(1).ToString}
CtrlCombo.Items.Add(newItem)
Next
CtrlCombo.ValueMember = "Value"
CtrlCombo.DisplayMember = "Display"
End Sub
现在还有其他常用功能,可以从表单(winform)上的各种控件收集数据。 在那里,我检查字段的控制类型和数据类型,细化数据并添加到键值对。
因此,常见的 CollectFormData 函数如下(部分)。我检测 m01OpnCrDr 组合框并尝试获取值 C(如果选择贷方)或 D(如果选择借方)以将该 C 或 D 存储到数据库字段。 但组合框返回“Nothing”。
收集表单数据的功能:
Function CollectFormData(frm As Form, tbl As DataTable)
'Function CollectFormData(frm As Form, FieldList As List(Of String)) As Dictionary(Of String, Object)
Dim FormDataDict As New Dictionary(Of String, Object)
Dim CtlType As Type
Dim CtrlArray As Control()
Dim Ctrl As Control
Dim fldname As String
Dim FldType As OleDb.OleDbType
Dim CtlValuePlaceHolder As Object
For Each row As DataRow In tbl.Rows
fldname = row("COLUMN_NAME")
FldType = row("DATA_TYPE").ToString
If fldname = "ID" Then
'do nothing
Else
CtrlArray = frm.Controls.Find(fldname, True)
If CtrlArray.Count > 0 Then
Ctrl = CtrlArray(0)
CtlType = Ctrl.GetType
Select Case CtlType
Case GetType(TextBox)
CtlValuePlaceHolder = CNulls(TryCast(Ctrl, TextBox).Text, FldType)
FormDataDict.Add(fldname, CtlValuePlaceHolder)
Case GetType(ComboBox) **'(here combobox m01OpnCrDr returns Nothing)**
'CtlValuePlaceHolder = CNulls(TryCast(Ctrl, ComboBox).SelectedValue, FldType)
Dim selectedValue As Object = TryCast(Ctrl, ComboBox).SelectedValue
CtlValuePlaceHolder = CNulls(selectedValue, FldType)
FormDataDict.Add(fldname, CtlValuePlaceHolder)
'CtlValuePlaceHolder = CNulls(selectedValue, FldType)
'FormDataDict.Add(fldname, CtlValuePlaceHolder)
Case GetType(C1.Win.Calendar.C1DateEdit)
CtlValuePlaceHolder = CNulls(TryCast(Ctrl, C1.Win.Calendar.C1DateEdit).Value, FldType)
FormDataDict.Add(fldname, CtlValuePlaceHolder)
Case GetType(CheckBox)
If TryCast(Ctrl, CheckBox).Checked Then
CtlValuePlaceHolder = True
Else
CtlValuePlaceHolder = False
End If
FormDataDict.Add(fldname, CtlValuePlaceHolder)
Case GetType(DateTimePicker)
CtlValuePlaceHolder = CNulls(TryCast(Ctrl, DateTimePicker).Value, FldType)
FormDataDict.Add(fldname, CtlValuePlaceHolder)
Case GetType(C1.Win.Calendar.C1DateEdit)
CtlValuePlaceHolder = CNulls(TryCast(Ctrl, C1.Win.Calendar.C1DateEdit).Value, FldType)
FormDataDict.Add(fldname, CtlValuePlaceHolder)
Case GetType(MaskedTextBox)
CtlValuePlaceHolder = CNulls(TryCast(Ctrl, MaskedTextBox).Text, FldType)
FormDataDict.Add(fldname, CtlValuePlaceHolder)
End Select
End If
End If
Next
Return FormDataDict
End Function
所以,终于我找到了解决方案。现在我不使用手动数据馈送填充组合框。现在我使用 DATATABLE。我将数据表作为组合框的源,它可以工作。在使用属性(值和显示)手动将项目添加到组合框时,属性设置不正确并且不被视为行。
所以最好的方法是创建数据表并将其源到组合框。 我更改的代码如下。
Sub CreateCRDRDataTable()
'gCRDRDataTable is global variable
gCRDRDataTable = New DataTable
gCRDRDataTable.Columns.Add("K", GetType(String))
gCRDRDataTable.Columns.Add("V", GetType(String))
gCRDRDataTable.Rows.Add("C", "Credit")
gCRDRDataTable.Rows.Add("D", "Debit")
End Sub
然后在需要时修复 sub 以填充 CRDRcombo。
Sub FillCRDRCombo(CtrlCombo As ComboBox)
CtrlCombo.DataSource = gCRDRDataTable
CtrlCombo.ValueMember = "K"
CtrlCombo.DisplayMember = "V"
End Sub
然后在从表单收集数据时效果很好。它获得价值(C 或 D) 以下是代码:
Case GetType(ComboBox)
CtlValuePlaceHolder = CNulls(TryCast(Ctrl, ComboBox).SelectedValue, FldType)
FormDataDict.Add(fldname, CtlValuePlaceHolder)
我的问题解决了