Множественный выбор в списке флажков для фильтрации данных vb.net - PullRequest
1 голос
/ 28 февраля 2012

надеюсь, у вас все хорошо.

У меня есть данные, загруженные из базы данных.Я связываю данные с табличным представлением на page_load.Теперь я хочу отфильтровать вид сетки по выбору пользователя, поэтому я создал список флажков и написал некоторый код в CheckBoxList1_SelectedIndexChanged

    Dim selectedartist As String = CheckBoxList1.SelectedItem.ToString()
    Dim dTable As DataTable = Session("dTable")
    Dim dTablenew As New DataTable

    Dim str As String = "Song_Artist ='" & selectedartist & "'"
    dTablenew = dTable.Select(str).CopyToDataTable

    GridView1.DataSource = dTablenew
    GridView1.DataBind()

С этим кодом выше, он может фильтровать, если в списке флажков есть только один выбор,Я пытаюсь зациклить список флажков сам, но всегда заканчивался ошибками.Надеюсь, кто-нибудь может помочь мне сделать эту работу.

Большое спасибо.

L

Это пример данных, которые у меня есть

dataset

1 Ответ

1 голос
/ 28 февраля 2012

Поскольку вы уже использовали расширение DataTable с CopyToDataTable:

Dim rows = From row In dTable.AsEnumerable()
           From item In CheckBoxList1.Items.Cast(Of ListItem)()
           Where item.Selected = True AndAlso _
           row.Field(Of String)("Song_Artist") = item.Text
           Select row
If rows.Any() Then
    Dim tblFiltered = tbl.CopyToDataTable()
End If

LINQ-To-DataSet

Или в синтаксисе метода (в VB.NET не очень читабельный)

Dim selected = CheckBoxList1.Items.Cast(Of ListItem).
               Where(Function(i) i.Selected = True).
               Select(Function(i) i.Text)
If selected.Any() Then
    Dim rows = dTable.AsEnumerable().
        Where(Function(r) selected.Contains(r.Field(Of String)("Song_Artist")))
    If rows.Any() Then
        Dim tblFiltered = rows.CopyToDataTable()
    End If
End If

Наконец, NET 2.0 DataTable. Выберите подход:

Dim selected As New List(Of String)
For Each item As ListItem In CheckBoxList1.Items
    If item.Selected Then
        selected.Add(String.Format("'{0}'", item.Text))
    End If
Next
If selected.Count <> 0 Then
    Dim rows = dTable.Select(String.Format(
                "Song_Artist IN ({0})",
                String.Join(",", selected)))
    If rows.Length <> 0 Then
        Dim tblFiltered = rows.CopyToDataTable()
    End If
End If
...