将主键从表绑定到checkedlistbox项以防止表更改出现问题

时间:2014-07-08 18:47:38

标签: vb.net

我有一个checkedlistbox,它是从我数据库中的表中的记录中填充的。我可以在表单加载时动态创建复选框,还可以在关闭时保存用户的选择。问题是如果在数据库中删除了一条记录,那么用户选择会发生变化,因为没有关于将它们绑定到表上主键的checkedlistbox项目。我将用户的选择存储为arraylist集合类型用户设置。

如何同时存储名称和主键,以便在数据库更改时,它不会影响用户的选择?

这是我的代码:

Public Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim conn As New ADODB.Connection()
        Dim database As String = "mydatabase"

        conn.CommandTimeout = 50400  '14 hours
        conn.Open("Provider=myprovider;Data Source=myserver;Initial Catalog=" & database & ";Integrated Security=SSPI")
        conn.CursorLocation = ADODB.CursorLocationEnum.adUseClient
        Dim rs As New ADODB.Recordset()

        Dim Sql As String
        Sql = "SELECT ProcessID, ProcessName FROM mytable WHERE is_active = 1"

        rs.Open(Sql, conn)

        Dim cnt As Integer

        If rs.BOF = True And rs.EOF = True Then
            cnt = 0
        Else
            rs.MoveFirst()
            cnt = rs.RecordCount
        End If

        Dim i As Integer
        i = 0

        While i < cnt
            CheckedListBox1.Items.Add(rs.Fields(1).Value)
            i = i + 1
            rs.MoveNext()
        End While

        'get user settings
        Me.email.Checked = My.Settings.email
        Me.pop.Checked = My.Settings.pop

        Dim index As Integer
        For Each item As String In My.Settings.selectedlistbox

            index = CheckedListBox1.Items.IndexOf(item)

            If index = -1 Then
                CheckedListBox1.SetItemChecked(item, True)
            Else
                CheckedListBox1.SetItemChecked(item, False)
            End If
        Next

 End Sub

1 个答案:

答案 0 :(得分:1)

使用简单的类并覆盖ToString函数:

Private Class ProcessItem
  Public Property ProcessID As Integer = 0
  Public Property ProcessName As String = String.Empty

  Public Overrides Function ToString() As String
    Return Me.ProcessName
  End Function
End Class

然后您可以添加您的信息:

CheckedListBox1.Items.Add(New ProcessItem With { _
                              .ProcessID = rs.Fields(0).Value, _
                              .ProcessName = rs.Fields(1).Value})