过滤没有数据源的DatagridView

Filter DatagridView without datasource

我正在尝试通过文本框的代码过滤手动加载的 datagridview。它不起作用,它告诉我 System.NullReferenceException.

Private Sub Frm_Canciones_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Me.Dgv_canciones.Rows.Clear()

    Dim request As New RestRequest("canciones", DataFormat.Json)

    ClienteRest.Cabeceras(request)

    Dim response = ClienteRest.cliente.Get(request)

    Dim respuesta As New JObject(CType(JsonConvert.DeserializeObject(response.Content), JObject))

    For Each token As JToken In respuesta.SelectToken("data")
        Dim song As Cancion = token.ToObject(Of Cancion)

        Me.Dgv_canciones.Rows.Insert(Me.Dgv_canciones.NewRowIndex, song.id, song.getTituloCompleto(), song.duracion, song.url, song.archivo)
    Next
End Sub

Private Sub Txt_buscar_TextChanged(sender As Object, e As EventArgs) Handles Txt_buscar.TextChanged
    If Me.Txt_buscar.Text.Length > 3 Then
        Dim campo As String = "cancion"

        Try
            CType(Me.Dgv_canciones.DataSource, DataTable).DefaultView.RowFilter = String.Format("[{0}] LIKE '%{1}%'", campo, Me.Txt_buscar.Text)
        Catch ex As Exception
            MessageBox.Show("Error: " & ex.Message, "Error!!!", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End If
End Sub

我是通过以下方式实现的。我已经创建了一个数据表,其中包含此 gridview 所需的字段。虽然,首先我在我的表单上创建了一个全局数据表。

    Dim dt As New DataTable
    dt.Columns.Add("id", GetType(String))
    dt.Columns.Add("cancion", GetType(String))
    dt.Columns.Add("duracion", GetType(String))
    dt.Columns.Add("url", GetType(String))
    dt.Columns.Add("archivo", GetType(String))

在循环中,我没有使用 datagridview 的插入方法,而是用接收到的数据填充了数据表。

    For Each token As JToken In respuesta.SelectToken("data")
        Dim song As Cancion = token.ToObject(Of Cancion)

        dt.Rows.Add(song.id.ToString, song.getTituloCompleto().ToString, song.duracion.ToString, song.url.ToString, song.archivo.ToString)

    Next

然后我将生成的 DataTable 映射到我的表单的全局 DataTable 以供以后使用。我已将 DataTable Global 指定为 DataGridView 的数据源。

    Me.GridTable = dt
    Me.Dgv_canciones.DataSource = Me.GridTable

最后,在 TextBox 的 TextChanged 事件中,我放置了一个条件,以便它仅在用户在文本字段中键入至少 3 个字符时才进行搜索。如果您输入的次数较少,它会加载整个歌曲列表,如果您输入的次数较多,它会加载搜索结果。

    If Me.Txt_buscar.Text.Length > 2 Then
        Dim campo As String = "cancion"

        Try
            Dim filter As String = String.Format("[{0}] LIKE '%{1}%'", campo, Me.Txt_buscar.Text)
            GridTable.DefaultView.RowFilter = filter
        Catch ex As Exception
            MessageBox.Show("Coño, no puedo buscar!!! Vaya mierda de programador está hecho el Zeko!!!" & vbCrLf & vbCrLf & "Error: " & ex.Message, "Coño!!!", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try

    ElseIf Me.Txt_buscar.Text.Length < 2 Then
        DirectCast(Me.Dgv_canciones.DataSource, DataTable).DefaultView.RowFilter = String.Empty
    End If

在这里我给你留下了完整的更正后的功能代码。

Public Class Frm_Canciones

Dim GridTable As DataTable

Private Sub Frm_Canciones_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Me.Dgv_canciones.Rows.Clear()

    Dim request As New RestRequest("canciones", DataFormat.Json)

    ClienteRest.Cabeceras(request)

    Dim response = ClienteRest.cliente.Get(request)

    Dim respuesta As New JObject(CType(JsonConvert.DeserializeObject(response.Content), JObject))


    Dim dt As New DataTable
    dt.Columns.Add("id", GetType(String))
    dt.Columns.Add("cancion", GetType(String))
    dt.Columns.Add("duracion", GetType(String))
    dt.Columns.Add("url", GetType(String))
    dt.Columns.Add("archivo", GetType(String))

    For Each token As JToken In respuesta.SelectToken("data")
        Dim song As Cancion = token.ToObject(Of Cancion)

        dt.Rows.Add(song.id.ToString, song.getTituloCompleto().ToString, song.duracion.ToString, song.url.ToString, song.archivo.ToString)

    Next

    Me.GridTable = dt
    Me.Dgv_canciones.DataSource = Me.GridTable

End Sub

Private Sub Txt_buscar_TextChanged(sender As Object, e As EventArgs) Handles Txt_buscar.TextChanged
    If Me.Txt_buscar.Text.Length > 2 Then
        Dim campo As String = "cancion"

        Try
            Dim filter As String = String.Format("[{0}] LIKE '%{1}%'", campo, Me.Txt_buscar.Text)
            GridTable.DefaultView.RowFilter = filter
        Catch ex As Exception
            MessageBox.Show("Coño, no puedo buscar!!! Vaya mierda de programador está hecho el Zeko!!!" & vbCrLf & vbCrLf & "Error: " & ex.Message, "Coño!!!", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try

    ElseIf Me.Txt_buscar.Text.Length < 2 Then
        DirectCast(Me.Dgv_canciones.DataSource, DataTable).DefaultView.RowFilter = String.Empty
    End If
End Sub

Private Sub Frm_Canciones_KeyDown(sender As Object, e As KeyEventArgs) Handles MyBase.KeyDown
    If e.KeyCode = Keys.Escape Then
        Me.Close()
    End If
End Sub

Private Sub Dgv_canciones_CellDoubleClick(sender As Object, e As DataGridViewCellEventArgs) Handles Dgv_canciones.CellDoubleClick
    If (Me.Dgv_canciones.CurrentRow.Index + 1) < Me.Dgv_canciones.Rows.Count Then
        Dim fPrograma As New Frm_programa

        Helpers.currentCancion = New Cancion(Me.Dgv_canciones.Rows.Item(Me.Dgv_canciones.CurrentRow.Index).Cells.Item(0).Value)

        Me.Close()
    End If
End Sub

结束Class