无法将类型 'System.Data.DataView' 的对象转换为类型 'System.Data.DataTable'

Unable to cast object of type 'System.Data.DataView' to type 'System.Data.DataTable'

在 VB.NET 中,我有 Button1,它填充了 datagridview1,我想要的是使用 textbox1_TextChanged 作为特定列的过滤器进行过滤。

我做错了什么? 我如何使用来自已绑定的网格数据源的源创建新的 dvs?

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

好吧,您在以下行中指定 DataView 作为 DataGridView 的来源:

Dim dv As New DataView(dt)
DataGridView1.DataSource = dv

然后您想将其转换为 DataTable:

Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
    Dim dvs As New DataView(CType(DataGridView1.DataSource, DataTable))
    ' ... 
End Sub

这不起作用,您需要将其转换为 DataView:

Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
    Dim dvs As DataView = CType(DataGridView1.DataSource, DataView)
    dvs.RowFilter = String.Format("userid like '%{0}%'", TextBox1.Text)
    ' DataGridView1.DataSource = dvs ' unnecessary
End Sub

因为它已经分配给 DataGridView1.DataSource 你可以省略最后一行。