VB. NET передать данные из mysql запроса в UserControl - PullRequest
0 голосов
/ 14 июля 2020

Я пытаюсь отобразить некоторые данные из моей mysql базы данных на панели flowlayoutpanel. Я создал UserControl с 3 разными метками, которые мне нужны: Title, Message и Time. И я хочу передать эти 3 информации из моего mysql запроса в UserControl, а затем для каждой записи в моей базе данных создать отдельный UserControl и вывести его в FlowLAyoutPanel.

My UserControl Code:

Public Class ChatControl

    Public _title As String
    Public _message As String
    Public _time As String

    Public Property Title As String
        Get
            Return _title
        End Get
        Set(ByVal value As String)
            _title = value
        End Set
    End Property

    Public Property Message As String
        Get
            Return _message
        End Get
        Set(ByVal value As String)
            _message = value
        End Set
    End Property

    Public Property Time As String
        Get
            Return _time
        End Get
        Set(ByVal value As String)
            _time = value
        End Set
    End Property

End Class

и это мой код формы:

Private Sub ChromeButton2_Click(sender As Object, e As EventArgs) Handles ChromeButton2.Click
    Dim SDA As New MySqlDataAdapter
    Dim dbDataSet As New Data.DataTable
    Dim bSource As New BindingSource
    Dim mysqlconn As New MySqlConnection(ConnectionString)
    mysqlconn.Open()
    Dim sqlcomand As String = "SELECT   Text,
                                        User,
                                        Time
                                       FROM     call_center.DB_Script_Chat;"
    command = New MySqlCommand(sqlcomand, mysqlconn)
    SDA.SelectCommand = command
    SDA.Fill(dbDataSet)
    bSource.DataSource = dbDataSet
    SDA.Update(dbDataSet)
    For Each row As DataRow In dbDataSet.Rows
        Dim myChat As New ChatControl()
        myChat.Title = row.Item("User").ToString
        myChat.Message = row.Item("Text").ToString
        myChat.Time = row("Time").ToString
        If FlowLayoutPanelChat.Controls.Count < 0 Then
            FlowLayoutPanelChat.Controls.Clear()
        Else
            FlowLayoutPanelChat.Controls.Add(myChat)
        End If
    Next
End Sub

Итак, FlowLayoutPanel показывает 3 записи (потому что в моей тестовой базе данных всего 3 строки данных), но данные из ячеек не заполнены в заголовке, сообщении и времени. Он всегда показывает значение дефолта, которое я установил в UserControl.

Пожалуйста, помогите. Спасибо

1 Ответ

1 голос
/ 14 июля 2020

Во-первых, это неправильный код:

For Each row As DataRow In dbDataSet.Rows
    Dim myChat As New ChatControl()
    myChat.Title = row.Item("User").ToString
    myChat.Message = row.Item("Text").ToString
    myChat.Time = row("Time").ToString
    If FlowLayoutPanelChat.Controls.Count < 0 Then
        FlowLayoutPanelChat.Controls.Clear()
    Else
        FlowLayoutPanelChat.Controls.Add(myChat)
    End If
Next

Как может количество элементов управления в панели быть меньше нуля? Я предполагаю, что на самом деле вы действительно хотите сначала очистить все существующие элементы управления, а затем добавить все новые. В этом случае вызов Clear должен быть вне циклов. Оператор If не требуется, потому что Clear не будет иметь никакого эффекта, если нет элементов управления:

FlowLayoutPanelChat.Controls.Clear()

For Each row As DataRow In dbDataSet.Rows
    Dim myChat As New ChatControl()
    myChat.Title = row.Item("User").ToString
    myChat.Message = row.Item("Text").ToString
    myChat.Time = row("Time").ToString
    FlowLayoutPanelChat.Controls.Add(myChat)
Next

Для записи, этот код также можно немного упростить:

FlowLayoutPanelChat.Controls.Clear()

For Each row As DataRow In dbDataSet.Rows
    FlowLayoutPanelChat.Controls.Add(New ChatControl With {.Title = row("User").ToString(),
                                                           .Message = row("Text").ToString(),
                                                           .Time = row("Time").ToString()})
Next

Что касается проблемы, посмотрите на свой класс ChatControl и покажите мне, где в этом коде есть ссылка на Labels. Как вы можете ожидать, что ваш Labels будет отображать текст, который вы передаете, если у вас нет кода для этого? Избавьтесь от этих полей и просто передайте свойства напрямую в свойства Text Labels, например

Public Property Title As String
    Get
        Return titleLabel.Text
    End Get
    Set
        titleLabel.Text = value
    End Set
End Property
...