首页 > 解决方案 > 我希望根据组合框选择转到下一行 SQL 数据

问题描述

基本上,如果组合框选择(字段)是“工程”,则只会显示与该选择对应的行。我用下面的代码实现了这一点。我想访问与此(字段)选择相似且仅对应于此(字段)选择的下一行数据,并适当地填充文本框控件。显示该行中该组合框选择下保存的所有数据。这工作正常。Button1_Click 下面的代码模块是我访问下一行的尝试;但是,显示不正确的数据。无论如何修复和显示所需的数据是 - 组合框选择符合数据库中标准的下一整行 SQL 数据?

Private Sub BtnSearch_Click(sender As Object, e As EventArgs) Handles BtnSearch.Click
    Dim Command As New SqlCommand("Select * From Table_Upload where Field = @Field", Connection)
    Dim DA As New SqlDataAdapter(Command)
    Dim DT As New DataTable()
    Dim DR As SqlDataReader
        
    Command.Parameters.Add("@Field", SqlDbType.VarChar).Value = CmbField.SelectedItem
    DA.Fill(DT)
    CmbField.DataSource = DT
    CmbField.DisplayMember = "Field"
    Connection.Open()
    DR = Command.ExecuteReader()
    
    If DR.Read() Then
        TxtTitle.Text = DR(0)
        TxtComp.Text = DR(1)
        TxtDate.Text = DR(2)
        TxtSalary.Text = DR(3)
        CmbEmp.SelectedItem = DR(4)
        TxtDesc.Text = DR(5)
        TxtExp.Text = DR(6)
        TxtPhone.Text = DR(7)
        TxtEmail.Text = DR(8)
        TxtAddr.Text = DR(9)
    End If
    
    Connection.Close()
End Sub

下一步代码:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles BtnNext.Click
    Dim Command As New SqlCommand("Select * From Table_Upload where Field = @Field", Connection)
    Dim DA As New SqlDataAdapter(Command)
    Dim DS As New DataSet()
    Dim DR As SqlDataReader

    Command.Parameters.Add("@Field", SqlDbType.VarChar).Value = CmbField.SelectedItem

    DA.Fill(DS, "Table_Upload")

    CmbField.DisplayMember = "Field"

    Connection.Open()
    DR = Command.ExecuteReader()
    If DR.Read() Then
        TxtTitle.Text = DR(+1).ToString()
        TxtComp.Text = DR(+1).ToString()
        TxtDate.Text = DR(+1).ToString()
        TxtSalary.Text = DR(+1).ToString()
        CmbEmp.SelectedItem = DR(+1).ToString()
        TxtDesc.Text = DR(+1).ToString()
        TxtExp.Text = DR(+1).ToString()
        TxtPhone.Text = DR(+1).ToString()
        TxtEmail.Text = DR(+1).ToString()
        TxtAddr.Text = DR(+1).ToString()
    End If
    Connection.Close()
End Sub

标签: sqlvb.net

解决方案


一旦你有了你的数据阅读器,创建一个DataTable并调用它的Load方法来加载所有的数据。DataTable然后,您可以将a绑定BindingSourceBindingSource您的TextBoxes. 然后,您可以调用MoveNext以推进数据。

myDataTable.Load(myDataReader)
myBindingSource.DataSource = myDataTable
myTextBox.DataBindings.Add("Text", myBindingSource, "MyColumn")

编辑:

在根据下面 Joel Coehoorn 的评论进行了一些阅读和测试之后,我了解到,虽然您不能将数据读取器直接绑定到 Windows 窗体中的控件,但您可以将一个绑定到 aBindingSource并且它会生成一个IBindingList(Of DataRecordInternal),它是 an IList,因此满足WinForms 绑定的要求。ADataRecordInternal可以按列名或序号以与 aDataRowDataRowViewcan 相同的方式进行索引,因此出于绑定目的可以以几乎相同的方式处理它们,例如

Using connection As New SqlConnection("connection string here"),
      command As New SqlCommand("SELECT * FROM MyTable", connection)
    connection.Open()

    Using reader = command.ExecuteReader()
        BindingSource1.DataSource = reader
        ComboBox1.DisplayMember = "Name"
        ComboBox1.ValueMember = "Id"
        ComboBox1.DataSource = BindingSource1
        TextBox1.DataBindings.Add("Text", BindingSource1, "Description")
    End Using
End Using

无论哪种方式


推荐阅读