将ComboBox / NumericUpDown选项绑定到数组?

时间:2014-12-05 18:46:18

标签: arrays vb.net combobox

我正在研究一个包含大量组合框和数字化项目的VB项目。

假设我们有ComboBox1,2,3,4和5;我们有NumericUpDown1,2,3,4,5。

当用户点击"保存"按钮,我想将所有选定的组合框项目和数字注册号码保存到CSV文件中。是否有一种优雅/自动的方法将这些项的所有.SelectedIndex和.Value绑定到一个数组,以便我可以轻松地将数组写入CSV?

到目前为止,我知道这样做的唯一方法是手动将每个人与数组位置相关联:

Arr(0) = ComboBox1.SelectedIndex
Arr(1) = ComboBox2.SelectedIndex
...
Arr(5) = NumericUpDown1.Value
Arr(6) = NumericUpDown2.Value
...
etc. 

这不会太糟糕,除了我有很多这些项目,并为每一个写一行似乎很愚蠢。我是VB的新手,所以这对某些人来说可能是一个明显的解决方案。有什么想法吗?

将它们绑定到数组会非常方便,因为我还允许用户加载CSV文件,我想从CSV值自动填充ComboBoxes和NumericUpDowns。我知道这样做的唯一方法是在单击“加载文件”按钮时手动将每个数组项移动到相应的组合框/数字项:

ComboBox1.SelectedIndex = Arr(0)
ComboBox2.SelectedIndex = Arr(1)
...
NumericUpDown1.Value = Arr(5)
NumericUpDown2.Value = Arr(6)
...
etc. 

编辑:这是一些请求的应用信息......

可以保存/加载的CSV文件如下所示:

#"Device Info","123456","asdfgh","0000","1.0x","1"
000F,0000,0032,0000,00C8,0001,0078,0101,0000,0001,0000,0001
010F,0078,0000,0103,0001,0000,000A,0005,0007,0006,0000
0001,000A,000A,000A,000A,0005,0005,0005,0002
...etc

标题行只有序列号,版本和其他misc信息;它由目标设备自动生成。所有其他行都是目标设备读入的配置设定点,并自动配置自身。我正在编写这个PC程序,以便能够使用漂亮的GUI界面编辑(并从头开始创建)这些配置CSV文件。每个项目都绑定到一个特定的设定点,例如000F =语言,0032 =系统频率,00C8 =系统电压等。我看到制作此配置程序的最简单方法是使用用户的数字输入和下拉组合框可以选择他们想要的东西。每个NUD和CBOX等同于一个CSV文件数据字段。

2 个答案:

答案 0 :(得分:0)

您可以使用Controls.Find()根据索引值获取对所需控件的引用。这是一个快速举例说明我的意思:

For i As Integer = 1 To 30
    Dim matches() As Control = Me.Controls.Find("NumericUpDown" & i, True)
    If matches.Length > 0 AndAlso TypeOf matches(0) Is NumericUpDown Then
        DirectCast(matches(0), NumericUpDown).Value = i
    End If
Next

您可以将这样的代码合并到加载/保存例程中。

答案 1 :(得分:0)

我会使用二进制序列化。这样就无需在保存控件属性时格式化字符串或xml。与Plutonix的解决方案类似,它仅适用于某些类型的控制。但是,它可以修改为适用于任何类型的控件 - 但只支持为每个控件加载一个属性。它适用于类型 X的所有控件,而不是名为 xName的控件。您可以通过将要控制的控件分组到面板或其他方式来添加进一步的限制。

创建一个名为Form1的新表单。添加一些NumericUpDowns,TextBoxes和ComboBoxes。在设计时将一些值放在ComboBox中,否则在loadState()中调用Form_Load将毫无意义。但是,只要在组合完成组合框之后就可以调用loadState()

您需要导入这两个名称空间:

Imports System.IO
Imports System.Runtime.Serialization.Formatters.Binary

在你班上:

Private Shared stateFileName As String = "SavedState.bin"

Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
    saveState(Me)
End Sub

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    loadState(Me)
End Sub

这些是您将用于保存和加载状态的方法。保存状态方法:

Private Shared Sub saveState(instance As Form)
    Dim controlProperties As Dictionary(Of String, Object) =
        instance.Controls.OfType(Of Control).ToDictionary(Of String, Object)(
            Function(c) c.Name,
            Function(c)
                ' You can support different types of controls here too
                If TypeOf c Is NumericUpDown Then
                    Return CType(c, NumericUpDown).Value
                ElseIf TypeOf c Is ComboBox Then
                    Return CType(c, ComboBox).SelectedIndex
                Else
                    ' All other controls get their text property saved
                    ' .Text is a property of Control
                    Return c.Text
                End If
            End Function)
    Using myFileStream As Stream = File.Create(stateFileName)
        Dim serializer As New BinaryFormatter
        serializer.Serialize(myFileStream, controlProperties)
    End Using
End Sub

加载状态方法:

Private Shared Sub loadState(instance As Form)
    If File.Exists(stateFileName) Then
        Using myFileStream As Stream = File.OpenRead(stateFileName)
            Dim deserializer As New BinaryFormatter()
            Dim controlProperties = CType(deserializer.Deserialize(myFileStream), Dictionary(Of String, Object))
            For Each c As Control In instance.Controls
                If controlProperties.ContainsKey(c.Name) Then
                    ' You can support different types of controls here too
                    If TypeOf c Is NumericUpDown Then
                        CType(c, NumericUpDown).Value = CDec(controlProperties(c.Name))
                    ElseIf TypeOf c Is ComboBox Then
                        CType(c, ComboBox).SelectedIndex = CInt(controlProperties(c.Name))
                    Else
                        c.Text = controlProperties(c.Name).ToString()
                    End If
                End If
            Next
        End Using
    End If
End Sub

您应该添加异常处理,并注意,如果没有计算机的帮助,二进制文件不应由人进行编辑。