JKCNAIR Ответов: 1

Vb.net ListBox index changed показывает неверное значение из базы данных sqlite


Всем привет
Я кодирую а vb.net программа, которая использует sq lite в качестве базы данных. Моя проблема заключается в том, что при загрузке формы она отображает все значения из определенного столбца ( вопросы в моем случае) из базы данных в список. Затем, если вы нажмете на какой-либо элемент ( изменение индекса списка), соответствующее значение из базы данных ( ответ) отобразится в поле rich text. До сих пор это работает так, как и ожидалось.
когда пользователь вводит что-то в текстовое поле и нажимает кнопку поиска, ожидается, что он покажет вопросы из базы данных в соответствии с текстом текстового поля в качестве столбца тега в базе данных в том же списке. это тоже прекрасно работает....Проблема начинается тогда, когда
индекс listbox теперь меняется...если результатом поиска является только один элемент в listbox, индекс будет равен нулю,а rich textbox показывает Первый элемент базы данных вместо соответствующего значения элемента listbox.
пожалуйста, помогите мне решить эту проблему.
Мой код здесь для вашего любезного рассмотрения:-

Что я уже пробовал:

<pre>
Sub showData()'''this shows questions when form loads
        connect()
        Dim da As New SQLiteDataAdapter("select * from elect", connection)
        'Dim dt As New DataTable
        Dim ds As New DataSet
        da.Fill(ds, "elect")
        Dim mySelectQuery As String = "select * from elect"
        Dim sqConnection As New SQLiteConnection(connection)
        Dim sqCommand As New SQLiteCommand(mySelectQuery, sqConnection)
        'sqConnection.Open()
        Try
            Dim sqReader As SQLiteDataReader = sqCommand.ExecuteReader()

            ' Always call Read before accessing data.
            Do While sqReader.Read()
                Dim sName = sqReader.Item("question")

                ListBox1.Items.Add(sName)
            Loop

            ' always call Close when done reading.
            sqReader.Close()

            ' Close the connection when done with it.
        Finally
            connection.Close()
        End Try


    End Sub

  Public Sub NavigateRecords()
        page1.Clear()''page is rich text box
       

        connect()
        Dim da As New SQLiteDataAdapter("select * from elect", connection)
        'Dim dt As New DataTable
        Dim ds As New DataSet
        da.Fill(ds, "elect")
       
        Dim mySelectQuery As String
     
        mySelectQuery = "select * from elect"

        Dim sqConnection As New SQLiteConnection(connection)
        Dim sqCommand As New SQLiteCommand(mySelectQuery, sqConnection)
        Dim num As Integer = Me.inc = Conversions.ToInteger(ListBox1.SelectedIndices.ToString)
        MsgBox(num)
        Me.inc = Conversions.ToInteger(ListBox1.SelectedIndex.ToString)
        If (Me.inc > -1) Then
          
                Dim ans As String = Conversions.ToString(ds.Tables.Item("elect").Rows.Item(Me.inc).Item(2))

                page1.Text = (ans)
 End If
  End Sub

  
Private Sub search()
        connect()
        Dim da As New SQLiteDataAdapter("select * from elect", connection)
        'Dim dt As New DataTable
        Dim ds As New DataSet
        da.Fill(ds, "elect")
        Dim mySelectQuery As String = ("select * from elect WHERE tag like'%" & txtSearch.Text & "%' ")
        Dim sqConnection As New SQLiteConnection(connection)
        Dim sqCommand As New SQLiteCommand(mySelectQuery, sqConnection)
        Try
            Dim sqReader As SQLiteDataReader = sqCommand.ExecuteReader()

            ' Always call Read before accessing data.
            Do While sqReader.Read()
                Dim sName = sqReader.Item("question")

                ListBox1.Items.Add(sName)
            Loop
            If ListBox1.Items.Count = 0 Then
                MsgBox("Nothing Found ")
                
                showData()
      

               


            End If
            ' always call Close when done reading.
            sqReader.Close()

            ' Close the connection when done with it.
        Finally
            connection.Close()
        End Try
    End Sub



 Private Sub ListBox1_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles ListBox1.SelectedIndexChanged
        page1.Visible = True
        
        ListBox1.Visible = False
       
        Label1.Visible = False
        
            NavigateRecords()



    End Sub

1 Ответов

Рейтинг:
10

NightWizzard

Ваше решение полностью отделяет элементы списка от таблицы базы данных, поэтому вы не можете идентифицировать требуемую запись базы данных по выбранному индексу. Лучше: создать простой класс, который содержит первичный ключ и поле, используемое для отображения в списке. Перезаписать метод ToString этого класса, чтобы вернуть текст отображения. Затем создайте экземпляр этого класса для каждой записи в вашей таблице и добавьте этот объект как элемент в свой список. Когда выбор сделан, приведите выбранный элемент обратно к типу класса и прочтите первичный ключ. Затем запросите таблицу базы данных для этого ключа, который всегда возвращает только одну совпадающую запись. Это решит все ваши проблемы. Быстрый пример, предполагая, что ваш первичный ключ - Guid (для int измените тип свойства ID на Integer):

Private Class clsListBoxItem
    Public Property ID As Guid = Nothing
    Private Name As String = String.Empty

    Public Sub New(ByVal PK As Guid, ByVal DisplayName As String)
        ID = PK
        Name = DisplayName
    End Sub

    Public Override Function ToString() As String
       Return Name
    End Function
End Class


Заполните поле списка:

MyListBox.Items.Clear

   'Fill the reader object here
  
   If Reader.HasRows
      Do While Reader.Read()
         Dim objItem As New clsListBoxItem(Reader.Item("ID"), _ Reader.Item("Question")

         MyListBox.Itms.Add(objItem)
      Loop
   End If


- Получить выбранный предмет:

Dim objItem As clsListBoxItem = TryCast(MyListBox.SelectedItem, clsListBoxItem)

   Dim PK As Guid = objItem.ID

   Dim strSELECTCmd = "SELECT * FROM elect WHERE (ID = @ID)


- Установите здесь параметр SQL и выполните запрос....

Удачи вам!


JKCNAIR

Спасибо NightWiz.. с небольшой настройкой и методом проб и ошибок Ваш совет решил проблему.

NightWizzard

Я рад, что смог помочь ;-)