FlowLayoutPanel не распознает свои элементы управления

Я пытался создать функцию динамического поиска, которая использует несколько пользовательских элементов управления (полос) для создания условий поиска. Струны строятся правильно, поэтому проблем нет. Однако когда в модуле вызывается функция search(), flowLayoutPanel больше не распознает, что внутри нее есть полосы (я поместил окна сообщений, чтобы отследить, где они потерялись). Мы ценим любые предложения.

************** frmAttributesSearch Class ********************************** **************

Public Class frmAttributesSearch

    Private Sub btnAddCondition_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAddNewCondition.Click
        FlowLayoutPanel1.Controls.Add(New UCAddAttribute)
        MsgBox("Controls are here when added: " & FlowLayoutPanel1.Controls.Count)
    End Sub

    Private Sub btnSearch_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSearch.Click
        MsgBox("Still here on search click: " & FlowLayoutPanel1.Controls.Count)
        dgPlayers.DataSource = search()
    End Sub

    Public Function buildFilterString()
        MsgBox("Still lost on buildFilterString: " & FlowLayoutPanel1.Controls.Count)
        Dim myString As String = ""

        For Each strip As UCAddAttribute In FlowLayoutPanel1.Controls
            myString = myString + strip.cmbAttribute.SelectedItem & " " & strip.cmbEqualityFactor.SelectedItem & " " & Integer.Parse(strip.txtNumber.Text) & " AND "
        Next

        myString = myString + "1 = 1"

        Return myString

    End Function

End Class

************** Модуль *********************************** ******************************

Public Function search() As DataTable

        MsgBox("Lost here on search: " & frmAttributesSearch.FlowLayoutPanel1.Controls.Count)

Dim dt As New DataTable
        Dim Str As String = _
       <String> SELECT 
                    *
                FROM 
                    Player
                INNER JOIN Report ON Report.PlayerID = Player.PlayerID
                WHERE                 
                <%= frmAttributesSearch.buildFilterString() %>                    
                ORDER BY 
                    ReportDate
       </String>
        Try '@txtNumber>>> was at the end of buildFilterString
            Using conn As New SqlClient.SqlConnection(DBConnection)
                conn.Open()
                Using cmdQuery As New SqlClient.SqlCommand(Str, conn)
                    Using daResults As New SqlClient.SqlDataAdapter(cmdQuery)
                        daResults.Fill(dt)
                    End Using
                End Using
            End Using

        Catch ex As Exception
            MsgBox("Filter Search Exception: " & ex.Message & vbNewLine & Str)
        End Try

        Return dt

    End Function

1 ответ

Решение

Попробуйте отправить фильтры в функцию.

Public Shared Function search(filters As String) As DataTable
Dim dt As New DataTable
    Dim Str As String = _
   <String> SELECT 
                *
            FROM 
                Player
            INNER JOIN Report ON Report.PlayerID = Player.PlayerID
            WHERE                 
            <%= filters %>                    
            ORDER BY 
                ReportDate
   </String>
    Try '@txtNumber>>> was at the end of buildFilterString
        Using conn As New SqlClient.SqlConnection(DBConnection)
            conn.Open()
            Using cmdQuery As New SqlClient.SqlCommand(Str, conn)
                Using daResults As New SqlClient.SqlDataAdapter(cmdQuery)
                    daResults.Fill(dt)
                End Using
            End Using
        End Using

    Catch ex As Exception
        MsgBox("Filter Search Exception: " & ex.Message & vbNewLine & Str)
    End Try

    Return dt

End Function

Использование:

dgPlayers.DataSource = search(buildFilterString())
Другие вопросы по тегам