【问题标题】:Listview help needed需要列表视图帮助
【发布时间】:2013-12-12 11:31:59
【问题描述】:

作为一个相对较新的 vb.net 用户,我感到很困惑。为什么我的列表视图没有修改列表中的值?如果可以的话,我可以正确地了解 listview 如何从数据库中显示其数据。除了代码问题,我还有一个一般性问题。

我的列表视图中有五列 (0-4)。我是否正确地说,如果我的访问数据库包含 10 个字段但我只需要显示其中五个但其中一个是字段 (9),那么将像下面的代码一样对列表进行编码,这不会改变值和如果我删除“else”语句,只会显示列表。

什么是错误?非常感谢

更新代码:

oledbCnn.ConnectionString = My.Settings.storageConnectionString
        oledbCnn.Open()

        'drcount = Convert.ToInt32(dr("RowCount"))

        sql = "Select TOP 100 * from Requests ORDER BY [Date-time received] DESC"
        Debug.Print(sql)
        Dim oledbCmd As OleDbCommand = New OleDbCommand(sql, oledbCnn)


        Using dr = oledbCmd.ExecuteReader()


            'clear items in the list before populating with new values
            'lvRequests.Items.Clear()

            While dr.Read()
                If dr.HasRows Then
                    Dim LVI As New ListViewItem

                    With LVI
                        .Text = dr(0).ToString()
                        .UseItemStyleForSubItems = False
                        .SubItems.Add(CDate(dr(5)).ToShortDateString())
                        .SubItems.Add(dr(1).ToString())
                        .SubItems.Add(dr(3).ToString())
                        If dr(3).ToString = "D" Then
                            .SubItems(3).Text = "Destroyed"
                        ElseIf dr(3).ToString = "O" Then
                            .SubItems(3).Text = "Out"
                        ElseIf dr(3).ToString = "I" Then
                            .SubItems(3).Text = "Intake"
                        End If
                        .SubItems.Add(dr(9).ToString())
                        If dr(9).ToString = "DEMO" Then
                            .SubItems(9).Text = "Done"

                        End If
                    End With
                    lvRequests.Items.Add(LVI)

                    lvcount += 1

                End If

            End While
        End Using

【问题讨论】:

  • 重要的是您的 SQL 语句中有多少列以及数据如何进入 LV。没有 SQL(因此有多少数据列要处理 SELECT * vs 'Select A, B, C, D, J FROM')。但是,如果您只向 LV 发布 5 位信息,那么您可能应该引用 SubItems(5)。也可以在 LV 中隐藏 SubItems。如果您添加 9 个子项,但只定义了 5 个列,则只会显示前 5 个。很难从那个小sn-p中说出更多信息。但是,DataGridView 通常是数据网格显示的更好选择。
  • 感谢 Plutonix。所以从你所说的,作为一个例子,在上面的mycode中,我想要的字段是从0开始访问的字段9,所以在我的例子中,dr(9)和subitems(9)是正确的?

标签: vb.net winforms listview


【解决方案1】:

没有足够的信息来真正确定发生了什么。您似乎从数据库中提取了 10 列,但如果您只将其中的 5 列发布到 LV,那么应该只有 5 个子项。所以这是错误的:

If dr(9).ToString() = "DEMO" Then
    lvRequests.Items(lvRequests.Items.Count - 1).SubItems(9).Text = "Done"

' should probably be: 
If dr(9).ToString() = "DEMO" Then
    lvRequests.Items(lvRequests.Items.Count - 1).SubItems(4).Text = "Done"

至少在代码中可以使其更清晰的是对子项使用名称。如果您实例化一个 SubItem 对象而不是使用默认构造函数,则可以分配一个名称并以这种方式引用它们:

Dim si As New ListViewItem.ListViewSubItem
With si
    .Text = dr(X).ToString        ' dunno whats in there
    ' this is probably not exactly right, but give the SubItem 
    ' the same name as the db column
    .Name = dr.Table.Columns(X).ColumnName
End With

thisItem.SubItems.Add(si)         ' add sub to Item collection

现在,您的代码可以使用名称而不是索引:

If dr(9).ToString() = "DEMO" Then
    lvReq.Items(lvReq.Items.Count - 1).SubItems("TheColumnName").Text = "Done"

有多少列或子项不再重要。 ListViewItem.SubItems 集合不要求子项名称是唯一的,因此可能以 2 同名结束,但如果您从 DR/DT/DB 正确映射,它应该会自行处理。

如果 LV 绑定到数据源(您没有说),那么 SubItems 的数量可能与 db/datasource 列一样多(实际上从未以这种方式使用过 LV)。

【讨论】:

  • 我仍然不是 100% 清楚答案。顺便说一句,它是不受约束的。所以我心里很清楚。在我更新的代码中,第 4 列正在从访问字段 9 中获取数据。我的代码在第 4 列中显示了正确的数据,但没有修改文本,但之前的代码 dr(3) 正确修改。
  • 感谢您提供额外的代码 - 您添加了 4 个子项,最后一个来自 dr(9),看起来像一个状态。但是最后一段代码,在添加了 fourth 子项之后,您尝试将“Done”放入 ninth 子项中。试试这个:.SubItems(LVI.SubItems.Count-1).Text = "Done"
  • 还是一样的 Plutonix。为什么这么难。
  • 实际上,Count-1 是错误的。 SubItem(0).TextItem.Text 相同,因此您可以循环通过 SubItems 来获取项目的所有文本。因此,即使它是基于 0 的,子项 4 也将是索引 4:.SubItems(4).Text = "Done"。它不会与SubItems(9).Text = "Done" 一起引发错误这一事实意味着您在其他地方添加了第九个 col/subItem。它可能不会显示列是否少于子项(向用户隐藏数据的巧妙方法)。考虑使用命名列以减少混淆
  • 我认为这与 NULL 条目有关。在调试中它显示为:System.IsDBNull。想法?
猜你喜欢
  • 2014-02-05
  • 1970-01-01
  • 1970-01-01
  • 2020-05-02
  • 1970-01-01
  • 1970-01-01
  • 2010-09-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多