【问题标题】:How do I use items in a listbox that are gathered from a database to select an item in the database如何使用从数据库收集的列表框中的项目来选择数据库中的项目
【发布时间】:2013-05-19 01:21:28
【问题描述】:

好的,现在这对我来说通常很容易,但是有一个小障碍正在制造它,所以我无法弄清楚。最好的方法是向您展示我的代码,然后进一步解释我正在尝试做什么。

附:这是一个地址簿程序,我只是为了好玩而创建的。

如果您只想跳到实际问题,则在底部。

这是我的Access数据库的连接:

Imports System.Data.OleDb

Module Database_Connection

    Public provider As String
    Public datafile As String
    Public connstring As String
    Public myconnection As OleDbConnection = New OleDbConnection
    Public dr As OleDbDataReader

    Public Sub Access_Database()

        provider = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source ="
        datafile = "AddressBook.accdb"
        connstring = provider & datafile
        myconnection.ConnectionString = connstring

        Try
            myconnection.Open()
        Catch ex As Exception
            MessageBox.Show("Error" & vbCrLf & vbCrLf & "Original Error: " & ex.ToString)
        Finally
            myconnection.Close()
        End Try

    End Sub


    End Module

数据库截图:

表格截图:

现在,在表单加载时,它从数据库(名称)中获取信息并用它们填充列表框

它用名字和姓氏填充它,因为它需要显示它。 这是在表单加载时执行此操作的代码:

    Private Sub frmMain_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

    Access_Database()

    Try
        myconnection.Open()

        Dim str As String

        str = "SELECT * FROM Contacts"

        Dim cmd As OleDbCommand = New OleDbCommand(str, myconnection)

        dr = cmd.ExecuteReader

        While dr.Read

            Nameslst.Items.Add(dr("FullName").ToString)

        End While

        Nameslst.Sorted = True

    Catch ex As Exception
        MessageBox.Show("There was an error: " & vbCrLf & vbCrLf & ex.ToString, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
    Finally
        myconnection.Close()
    End Try

End Sub

此处的实际问题:

现在,我如何设置他们在列表框中实际选择的内容来选择数据库中的数据?我会使用 Select Case 语句,但具体而言,列表框可​​以不定式填充,并且必须为添加的每个人在代码中输入一个新案例。

我不知道该怎么做,请帮忙!提前感谢所有回复。

【问题讨论】:

    标签: database vb.net ms-access select listbox


    【解决方案1】:

    您为Listbox.SelectedIndexChanged 添加一个处理程序。
    每当您收到此事件时,从当前选定项中提取 FullName 并使用字符串查询数据库。获得结果后,您相应地更新您的文本框

    Private Sub listBox1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles listBox1.SelectedIndexChanged
    
       if listBox1.SelectedItem Is Nothing Then
            return
       End If
    
       Dim curName As String = listBox1.SelectedItem.ToString()
       Try
    
           myconnection.Open()
    
           Dim str = "SELECT * FROM Contacts Where FullName=?"
           Dim cmd = New OleDbCommand(str, myconnection)
           cmd.Parameters.AddWithValue("@p1", curName)
           Dim dr = cmd.ExecuteReader
           While dr.Read
               txtBoxFirstName.Text = dr("FirstName").ToString()
               .....
               ... and so on for the other fields
           End While
      Catch(ex as Exception)
           MessageBox.Show(ex.Message)
      Finally
           myConnection.Close()
      End Try
    
    End Sub
    

    当然这是伪代码,需要做更多工作才能获得功能稳定的应用程序。
    例如,当您从数据库读回数据时,您需要检查DBNull.Value

    【讨论】:

    • @TonyHopkinson 确信在现实世界的应用程序中你应该处理同音异义词,但我认为这只是一个很好的练习,没有太多复杂性。
    • 不知道早教的习惯很难改掉。请注意,我从未提到过为单元测试做一个 ORM 和一些 DI...
    • 我没有唯一的列。它一直有效,直到 dbnull 发挥作用。这就是您所说的 DBnull 吗? If dr("FirstName") = IsDBNull(True) Then Else FirstNamelbl.Text = dr("FirstName") End If
    • FirstNameLbl.Text = if(dr.IsDbNull(dr.GetOrdinal("FirstName")), "---", dr("FirstName)) 但你的也很好
    • Acutally,你的工作,我的不行,哈哈,我不明白为什么,但我会试着弄清楚。再次感谢史蒂夫。再一次,你来救我了xD
    【解决方案2】:

    有几种方法可以做到这一点。这是一个 用say创建一个结构/类 联系人 ID、全名

    覆盖 ToString(),返回 FullName 在您的 while 循环中填写列表框,首先创建一个实例(联系人?),填写 ID 和 FullName,然后将其添加到列表中。

    然后当用户在事件处理程序转换中从列表框中选择一个项目时 ListBox.Selected 为您的结构/类的类型,获取 ID 属性 然后将其作为参数传递给'Select * From Contacts Where ContactID =?' 使用该查询的结果填写右侧

    您可能要考虑的另一个选项。 正在定义一个联系人类和一个 ContactList,并用另一种执行数据库操作的方法填充它。 目前,您的表单正在做所有事情。如果你想要另一个有联系人的人,也许是一棵树,显示你的哪些联系人有联系人,你会重复很多代码。

    【讨论】:

    • 我很可能会使用一种方法来获取传递的信息,我现在只是想让它的基本功能正常工作。感谢您的输入! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    相关资源
    最近更新 更多