Укажите значения в выпадающем списке с указанием c идентификаторов? - PullRequest
0 голосов
/ 21 января 2020

Я создал Sub, который будет заполнять мой комбобокс описаниями займов. Я хочу получить loancode из loandescription на selectedindexchanged без повторного запроса к базе данных. Это возможно? Или я должен запросить базу данных, чтобы получить указанный loancode?

Private Sub LoanProducts()
    Using cmd As New SqlClient.SqlCommand("SELECT loancode,loandescription FROM LoanProducts", gSQlConn)
        Dim dt As New DataTable
        Dim da As New SqlClient.SqlDataAdapter
        dt.Clear()
        da.SelectCommand = cmd
        da.Fill(dt)
        For Each row As DataRow In dt.Rows
            CmbLoanAvail.Items.Add(row("loandescription"))
        Next row
    End Using
End Sub

Ожидаемый результат:

Каждый раз при изменении индекса выпадающего списка, код ссуды выбранного описания ссуды будет отображаться в текстовом поле.

Ответы [ 3 ]

0 голосов
/ 21 января 2020

Установите DataTable для свойства combobox .DataSource и заполните свойства .ValueMember и. DisplayMember соответствующими именами столбцов.

Private Sub LoanProducts()
    Dim query As String = "SELECT loancode, loandescription FROM LoanProducts"
    Using command As New SqlCommand(query, gSQlConn)
        Dim data As New DataTable
        Dim adapter As New SqlClient.SqlDataAdapter With
        {
            .SelectCommand = cmd
        }

        adapter.Fill(data)

        CmbLoanAvail.ValueMember = "loancode"
        CmbLoanAvail.DisplayMember = "loandescription"
        CmbLoanAvail.DataSource = data
    End Using
End Sub

Вы можете использовать событие SelectionChangeCommitted для выполнения какого-либо действия, когда пользователь сделал выбор

Private Sub comboBox1_SelectionChangeCommitted(
    ByVal sender As Object, ByVal e As EventArgs) Handles comboBox1.SelectionChangeCommitted

    Dim combobox As ComboBox = DirectCast(sender, ComboBox)

    Dim selectedCode As String = combobox.SelectedValue.ToString()  // returns 'loancode'
End Sub
0 голосов
/ 21 января 2020

Храните объекты базы данных локально по отношению к методу, в котором они используются, чтобы вы могли убедиться, что они закрыты и удалены. Обратите внимание на запятую в конце первой строки Using. Сюда входит команда в том же блоке Using.

Установите DataSource, DisplayMember и ValueMember после блока Using, чтобы код пользовательского интерфейса не выполнялся до тех пор, пока не будет установлено соединение.

Чтобы получить код ссуды, вы просто получаете доступ к SelectValue из ComboBox.

Private Sub LoanProducts()
    Dim dt As New DataTable
    Using gSqlConn As New SqlConnection("Your connection string"),
            cmd As New SqlClient.SqlCommand("SELECT loancode,loandescription FROM LoanProducts", gSqlConn)
        gSqlConn.Open()
        dt.Load(cmd.ExecuteReader)
    End Using
    ComboBox1.DataSource = dt
    ComboBox1.DisplayMember = "loandescription"
    ComboBox1.ValueMember = "loancode"
End Sub

Private Sub ComboBox1_SelectionChangeCommitted(ByVal sender As Object, ByVal e As EventArgs) Handles ComboBox1.SelectionChangeCommitted
    MessageBox.Show($"The Loan Code is {ComboBox1.SelectedValue}")
End Sub
0 голосов
/ 21 января 2020

Если бы вы могли получить строки БД в виде строго типизированных классов, вы могли бы использовать ItemSource, DisplayMember и ValueMember, что решило бы вашу проблему.

В случае, если вы представили, вы можете используйте SelectedIndex свойство ComboBox. Также вам нужно сохранить набор результатов в некотором поле класса (желательно Pirvate один). Смотрите пример кода ниже:

Public Class Form4
    Private _result As DataTable

    Private Sub Form4_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim dt As New DataTable
        dt.Columns.Add("col1")
        dt.Columns.Add("col2")
        dt.Rows.Add("val11", "val12")
        dt.Rows.Add("val21", "val22")
        ' at this point, we got our result from DB
        _result = dt

        For Each row As DataRow In dt.Rows
            ComboBox1.Items.Add(row("col1"))
        Next
    End Sub

    Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
        Dim selectedIndex = ComboBox1.SelectedIndex
        Dim selectedRow = _result(selectedIndex)
    End Sub
End Class
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...