【问题标题】:Unable to cast object of type 'System.Data.DataView' to type 'System.Data.DataTable'无法将“System.Data.DataView”类型的对象转换为“System.Data.DataTable”类型
【发布时间】: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 = dtdt,不是dv)。之后,DirectCast(DataGridView1.DataSource, DataTable).DefaultView.RowFilter = " ... "。删除其余部分。
  • 哇!这就像一个魅力!非常感谢!!
  • 创建和绑定DataView 绝对没有意义,因为当您绑定DataTable 时,您看到的数据无论如何都来自它的DefaultView,那就是DataView。也就是说,也不要将DataTable 绑定到网格。在设计器中添加BindingSource,将DataTable 绑定到该设计器,并将BindingSource 绑定到网格。然后使用BindingSourceFilterSort 属性进行过滤和排序。
  • 另外,您不可能在绑定后设置网格列的DataPropertyName。如果绑定时自动生成这些列,则 DataPropertyName 已设置。如果您在设计器中创建这些列,那么您应该在设计器中设置DataPropertyName。如果您在代码中手动创建列,那么您应该立即在代码中设置DataPropertyName。无论如何创建列,绑定后设置DataPropertyName都是错误的。

标签: vb.net datagrid


【解决方案1】:

好吧,您在以下行中将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,所以可以省略最后一行。

【讨论】:

  • 蒂姆,这也是正确答案!非常感谢...
猜你喜欢
  • 2012-02-17
  • 2018-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-24
  • 1970-01-01
相关资源
最近更新 更多