【问题标题】:List View Population Errors列表视图填充错误
【发布时间】:2016-05-23 13:52:25
【问题描述】:

当用户按下“搜索”时,我有 3 列需要填充,但是每次我单击“搜索”时,只会出现员工 ID,列表视图中既不显示“名字”也没有“姓氏” .数据确实存在于我的 Access 数据库中,这被证明是因为程序产生了空白记录而不是空值错误。我用来填充列表视图的代码是:

        ds.Clear()
        lstClockin.Items.Clear()
        con.ConnectionString = provider & datafile
        con.Open()                                          'Open connection to the database
        sqlstatement = "SELECT * FROM [EmployeeAccounts]"
        da = New OleDb.OleDbDataAdapter(sqlstatement, con)
        da.Fill(ds, "allmembers")                           'Fill the data adapter
        con.Close()
        Dim recordCount, x As Short
        recordCount = 0
        x = 0
        recordCount = ds.Tables("allmembers").Rows.Count
        With ds.Tables("allmembers")
            Do Until x = recordCount
                lstClockin.Items.Add(.Rows(x).Item(0))
                lstClockin.Items(x).SubItems.Add(.Rows(x).Item(1))
                lstClockin.Items(x).SubItems.Add(.Rows(x).Item(2))
                lstClockin.Items(x).SubItems.Add(.Rows(x).Item(3))
                x = x + 1
            Loop
        End With

数据库中的前 3 列是 [Employee ID]、[First Name] 和 [Last Name]

欢迎提出任何建议;但是我已经排除了使用 DataGridView 或任何控件。由于该程序需要使用 ListView。提前谢谢你!

【问题讨论】:

  • 为什么不使用 TreeView
  • 布局不一样,也不是这个特定程序需要的东西“这个程序需要使用ListView”
  • ok @Matt E 看看我的回答

标签: vb.net listview


【解决方案1】:

代码中有几处可以改进的地方:

Dim SQL = "SELECT Id, Name, Fish FROM Sample"

Using dbcon As New OleDbConnection(ACEConnStr)
    Using cmd As New OleDbCommand(SQL, dbcon)

        dbcon.Open()
        Dim lvi As ListViewItem
        myLV.SuspendLayout()
        Using rdr = cmd.ExecuteReader
            Do While rdr.Read

                lvi = New ListViewItem(rdr.GetInt32(0).ToString)
                If rdr.IsDBNull(1) Then
                    lvi.SubItems.Add("")
                Else
                    lvi.SubItems.Add(rdr.GetString(1))
                End If

                If rdr.IsDBNull(2) Then
                    lvi.SubItems.Add("")
                Else
                    lvi.SubItems.Add(rdr.GetString(2))
                End If
                myLV.Items.Add(lvi)
            Loop
        End Using
        myLV.ResumeLayout()

    End Using
End Using
  • 连接和其他 DB Provider 对象分配需要释放的资源,否则您的应用程序将泄漏。实现 Dispose 的事物的 Using 块将关闭并为您处理它们
  • 不需要DataAdapterDataSetDataTable,因为您正在将数据复制到控件。此代码使用DataReader 来获取数据。
  • 查询指定列/顺序而不是SELECT *,因此它可以使用Getxxxxx 方法来获取类型化数据。 在这种情况下并不重要,因为所有内容都会转换为ListView 的字符串。 lvi.SubItems.Add(rdr(COLUMN_NAME).ToString()) 也可以。
  • ID 列似乎不太可能为空,因此代码仅检查另外 2 个 DbNull(DGV 无需帮助即可处理的另一件事)。
  • 由于ListView 不是最理想的并且添加项目的速度很慢,因此SuspendLayoutResumeLayout 用于在填充时最小化绘制。

我完全不确定...the program produces a blank record 是什么意思,但是为了像网格一样使用ListViewView 属性必须是Details,并且您必须在 IDE 中添加 3 列(或在代码中手动创建它们)。没有这些设置,什么都不会显示。

如果在其他地方需要/使用DataTable,您仍然可以在没有DataAdpater 的情况下填写一个并从中填充LV:

...
dt.Load(cmd.ExecuteReader)
For Each row As DataRow In dt.Rows

    lvi = New ListViewItem(row(0).ToString())
    If DBNull.Value.Equals(row(1)) Then
        lvi.SubItems.Add("")
    Else
        lvi.SubItems.Add(row(1).ToString())
    End If
    If DBNull.Value.Equals(row(2)) Then
        lvi.SubItems.Add("")
    Else
        lvi.SubItems.Add(row(2).ToString())
    End If
    myLV.Items.Add(lvi)
Next

这使用了不同的 DBNull 检查,因为它使用的是 DataRow 而不是 DataReader

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-05
    • 1970-01-01
    • 2012-07-14
    • 1970-01-01
    • 2021-03-08
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    相关资源
    最近更新 更多