【问题标题】:Change ListView status when found new result找到新结果时更改 ListView 状态
【发布时间】:2020-09-21 05:33:03
【问题描述】:

谁能帮助我我已经花了大约 2 个小时来解决我的 ListView 问题

我所做的是,如果在 ListView 项中找到文本(来自 lbloutputName.text),它将突出显示并显示 Processing...

的状态

这是我的问题。如果searchItem 从我的输出日志中发现新文本,我如何将状态更改为完成

这是我的想法,但我不知道该怎么做。

例如,如果我找到STRING1,状态将是Processing...,它会在 ListView 中突出显示该项目,然后如果找到新的STRING2STRING1 状态必须更改为 Done.,然后STRING2 将再次Processing

代码如下:

Dim searchItem As String = lblOutputName.Text

For Each lvi As ListViewItem In LV.Items
    For Each lvisub As ListViewItem.ListViewSubItem In lvi.SubItems
        If lvisub.Text = searchItem Then
            lvi.BackColor = Color.SteelBlue
            lvi.ForeColor = Color.White
            lvi.SubItems.Add("Processing...")
            LV.Focus()
            Exit For
        End If
    Next
Next

这是我的工具的屏幕截图:

【问题讨论】:

    标签: vb.net winforms listview


    【解决方案1】:

    我已经专门解决了更新状态的问题以及使用时的闪烁问题(也许也可以帮助其他人)

    Public Class ffListView
        Inherits ListView
    
        Public Sub New()
            Me.DoubleBuffered = True
        End Sub
    End Class
    

    我根据你的想法修改了我的代码。尽管我没有使用您给定的代码,但它确实对解决我的问题有很大帮助。 我只是决定而不是显示处理并完成。我只是显示进度

     Dim searchItem As String = lblOutputName.Text
                    For Each lvi As ListViewItem In LV.Items
                        For Each lvisub As ListViewItem.ListViewSubItem In lvi.SubItems
                            If lvisub.Text = searchItem Then
                                lvi.BackColor = Color.FromArgb(0, 99, 177)
                                lvi.ForeColor = Color.White
                                lvi.Text = String.Format("{0:F}", Progress).ToString & "%"
    
                                If lvi.Text = "100.00%" Then
                                    lvi.BackColor = Color.FromArgb(4, 117, 24)
                                    lvi.ForeColor = Color.White
                                End If
                                If abort Then
                                    lvi.BackColor = Color.DarkRed
                                    lvi.ForeColor = Color.White
                                End If
                                Exit For
    
                            End If
    
                        Next
                    Next
    

    【讨论】:

      【解决方案2】:

      要搜索ListViewItemListViewItem.ListViewSubItem 对象,请使用ListView.FindItemWithText 方法:

      Dim lvi = LV.FindItemWithText(searchItem)
      

      如果您只想搜索子项目(我从您的代码 sn-p 中了解到)并返回第一个匹配项,您可以这样做:

      Dim lvi = LV.Items.Cast(Of ListViewItem).
          FirstOrDefault(Function(x) x.SubItems.Cast(Of ListViewItem.ListViewSubItem).
          Skip(1).Any(Function(y) y.Text.ToLower = searchItem.ToLower))
      

      注意: ToLower 用于不区分大小写的搜索。

      回到您的主要问题,您需要找到一种方法来识别已处理的项目以设置其新状态(Done),并设置您从搜索中获得的项目的状态(Processing)查询是否有:

      If lvi IsNot Nothing Then
          LV.Items.Cast(Of ListViewItem).
          Where(Function(x) x IsNot lvi AndAlso x.BackColor = Color.SteelBlue).
          ToList().ForEach(Sub(x)
                               x.BackColor = SystemColors.Window
                               x.ForeColor = SystemColors.WindowText
                               x.SubItems(x.SubItems.Count - 1).Text = "Done..."
                           End Sub)
      
          lvi.BackColor = Color.SteelBlue
          lvi.ForeColor = Color.White
          lvi.SubItems(lvi.SubItems.Count - 1).Text = "Processing..."
      End If
      

      您可以改用Tag 属性来标识已处理的项目。

      If lvi IsNot Nothing Then
          LV.Items.Cast(Of ListViewItem).
              Where(Function(x) x IsNot lvi AndAlso x.Tag?.ToString = "p").
              ToList().ForEach(Sub(x)
                                   x.BackColor = SystemColors.Window
                                   x.ForeColor = SystemColors.WindowText
                                   x.SubItems(x.SubItems.Count - 1).Text = "Done..."
                                   x.Tag = "d"
                               End Sub)
      
          lvi.Tag = "p"
          lvi.BackColor = Color.SteelBlue
          lvi.ForeColor = Color.White
          lvi.SubItems(lvi.SubItems.Count - 1).Text = "Processing..."
      End If
      

      【讨论】:

      • 非常感谢您提供此代码。我试过了,它奏效了。我唯一的小问题是,当进程运行时列表视图会不断刷新
      猜你喜欢
      • 2017-11-16
      • 1970-01-01
      • 1970-01-01
      • 2018-05-11
      • 2018-02-19
      • 1970-01-01
      • 1970-01-01
      • 2021-02-09
      • 2020-05-08
      相关资源
      最近更新 更多