【发布时间】:2020-09-28 20:58:29
【问题描述】:
我正在尝试通过文本框的代码过滤手动加载的 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
【问题讨论】:
-
您从未将 DataTable 设置为 DGV 的数据源,因此
CType(Me.Dgv_canciones.DataSource, DataTable)不会让您得到太多,正如您已经知道的那样。您没有显示 JSON,但您可以直接反序列化为 DataTable。 -
问题是,如果datagridview是用insert方法循环填充的,并且没有关联的数据源或数据表,我怎么能只在文本框中显示与插入的文本匹配的行。
-
使用可以描述要在 DGV 中显示的值的类对象填充
BindingList<class>,使用 BindingList 作为 BindingSource 的 DataSource,将 BindingSource 设置为 DGV 的 DataSource使用 BindingSource 方法对 DGV 进行过滤、排序等。或者,填写一个提供相同工具的 DataTable。控件只是呈现器(呈现数据的工具),而不是数据存储/处理工具。如果您想有效地工作,您需要将数据与视图分开。否则,就是不断寻找新的hack。 -
谢谢,@Jimi。我已经用你的最后一个例子做到了。我刚刚发布了我应用的解决方案,它是 100% 功能的。非常感谢您的贡献。
标签: vb.net filter datagridview restsharp