VB.NET Combobox 中手动填充数据的字符串类型值成员和显示成员

问题描述 投票:0回答:1

我想从手动输入数据“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
vb.net winforms ms-access combobox save
1个回答
0
投票

所以,终于我找到了解决方案。现在我不使用手动数据馈送填充组合框。现在我使用 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)

我的问题解决了

© www.soinside.com 2019 - 2024. All rights reserved.