【发布时间】:2021-08-05 12:37:32
【问题描述】:
在 VB.NET 中,我有填充 datagridview1 的 Button1,我想要的是使用 textbox1_TextChanged 作为特定列的过滤器进行过滤。
我做错了什么? 如何使用来自网格的已绑定数据源的源创建新的 dv?
Public Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim _Session As ESSession
'Dim _dataset As DataSet
Dim _IMainUI As IMainUI
_IMainUI = Entersoft.Framework.Windows.Components.ESMainUI.GetMainUI()
_Session = _IMainUI.UISession
'Fill datagridview1
Dim SQL As String = "SELECT userid ,name , Inactive FROM esgouser order by userid"
Dim SQLParams As Hashtable = ESResMngr.CreateCIHashTable()
Dim ds As DataSet = _Session.FetchDS(SQL, Nothing, Nothing, SQLParams)
Dim dt As DataTable = ds.Tables(0)
Dim dv As New DataView(dt)
'Dim k As New DataView(dt)
DataGridView1.DataSource = dv
DataGridView1.Columns("Userid").DataPropertyName = "Userid"
DataGridView1.Columns("Name").DataPropertyName = "Name"
DataGridView1.Columns("InActive").DataPropertyName = "Inactive"
For Each row As DataGridViewRow In DataGridView1.Rows
If row.Cells(2).Value = "0" Then
row.DefaultCellStyle.BackColor = Color.FromArgb(0, 250, 154)
Else
row.DefaultCellStyle.BackColor = Color.FromArgb(255, 69, 0)
End If
Next
End Sub
Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
Dim dvs As New DataView(CType(DataGridView1.DataSource, DataTable))
dvs.RowFilter = String.Format("userid like '%{0}%'", TextBox1.Text)
DataGridView1.DataSource = dvs
End Sub
【问题讨论】:
-
还有一个问题...您是否建议使用任何其他免费的第三方 datagridview 控件,并在每个列的顶部进行主动过滤?
-
DataGridView1.DataSource = dt(dt,不是dv)。之后,DirectCast(DataGridView1.DataSource, DataTable).DefaultView.RowFilter = " ... "。删除其余部分。 -
哇!这就像一个魅力!非常感谢!!
-
创建和绑定
DataView绝对没有意义,因为当您绑定DataTable时,您看到的数据无论如何都来自它的DefaultView,那就是DataView。也就是说,也不要将DataTable绑定到网格。在设计器中添加BindingSource,将DataTable绑定到该设计器,并将BindingSource绑定到网格。然后使用BindingSource的Filter和Sort属性进行过滤和排序。 -
另外,您不可能在绑定后设置网格列的
DataPropertyName。如果绑定时自动生成这些列,则DataPropertyName已设置。如果您在设计器中创建这些列,那么您应该在设计器中设置DataPropertyName。如果您在代码中手动创建列,那么您应该立即在代码中设置DataPropertyName。无论如何创建列,绑定后设置DataPropertyName都是错误的。