0

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

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

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

这是与我的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 语句,但具体而言,列表框可​​以不定式填充,并且必须为添加的每个人在代码中输入一个新案例。

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

4

2 回答 2

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 。

于 2013-05-23T15:44:54.243 回答
0

有几种方法可以做到这一点。这是一个用说 ContactID、FullName 创建一个结构/类

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

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

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

于 2013-05-23T15:48:03.133 回答