过滤没有数据源的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
我正在尝试通过文本框的代码过滤手动加载的 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