【问题标题】:Selecting same row of multiple listview controls at the same time同时选择多个listview控件的同一行
【发布时间】:2014-03-31 04:06:54
【问题描述】:

在我的应用程序中,我有一个包含 5 个不同列表视图控件的表单。我试图在这里实现两件事,但我有点坚持......

1. 有没有办法让我在单击 Listview1 的第 3 行(例如)时,为所有 listview 控件选择第 3 行?我在 Listview1 的 _SelectedIndexChanged 事件中设置了以下代码,它可以正常工作,但是,我想这样做,所以如果用户点击任何 listview 的 row3,它会将所有 listview 控件更改为第 3 行。

Private Sub lsvRegisters_SelectedIndexChanged(sender As Object, e As EventArgs) Handles lsvRegisters.SelectedIndexChanged
    Try
        If Not lsvRegisters.SelectedItems.Count = 0 Then
            Dim index As Integer = lsvRegisters.SelectedIndices(0)

            If lsvRegister_Hardware.Items.Count > 0 Then lsvRegister_Hardware.Items(index).Selected = True
            If lsvRegister_Software.Items.Count > 0 Then lsvRegister_Software.Items(index).Selected = True
            If lsvRegister_Processes.Items.Count > 0 Then lsvRegister_Processes.Items(index).Selected = True
            If lsvRegister_System.Items.Count > 0 Then lsvRegister_System.Items(index).Selected = True
            If lsvRegister_Misc.Items.Count > 0 Then lsvRegister_Misc.Items(index).Selected = True
        End If

    Catch ex As Exception
        CreateLog("Module: lsvRegisters_SelectedIndexChanged()" & vbNewLine & "Exception Error: " & ex.Message)
        MsgBox("Exception Error: " & ex.Message, MsgBoxStyle.Critical, "Module: lsvRegisters_SelectedIndexChanged()")
    End Try
End Sub

其次:

2. 有没有办法让所有列表视图控件都将高亮栏作为活动颜色?目前它只显示带有蓝色突出显示栏的焦点列表视图控件,其他显示为暗灰色。我想(如果可能的话)让所有列表视图控件显示为蓝色,无论它是否有焦点。

任何帮助表示赞赏。 谢谢

更新 列表视图控件的多项选择现在可以按要求工作,但是,一旦列表视图失去焦点,它只会使第一个单元格突出显示,如下所示:

我用于设置列表视图控件的代码来自数据集。我已经演示了第一个列表视图,但是它们都是一样的。

        Try
            QueryString = "SELECT * FROM Registers WHERE StoreID = '" & _StoreCode & "'"
            Dim ExQry As New MySqlCommand(QueryString, MySQLConn)

            Dim da As New MySqlDataAdapter(ExQry)
            da.Fill(dsStoreDetail, "StoreDetail")
            Dim tempDT As DataTable = dsStoreDetail.Tables("StoreDetail")

            If dsStoreDetail.Tables.Count > 0 And dsStoreDetail.Tables(0).Rows.Count > 0 Then
                For x = 0 To (dsStoreDetail.Tables(0).Rows.Count - 1)
                    Dim lvi_RegistersItem As ListViewItem = lsvRegisters.Items.Add(tempDT.Rows(x)("Online").ToString)
                    lvi_RegistersItem.SubItems.Add(tempDT.Rows(x)("Lane").ToString)
                    lvi_RegistersItem.SubItems.Add(tempDT.Rows(x)("Host_Name").ToString)
                    lvi_RegistersItem.SubItems.Add(tempDT.Rows(x)("Reg_Type").ToString)
                    lvi_RegistersItem.SubItems.Add(tempDT.Rows(x)("Operator").ToString)
                    lvi_RegistersItem.SubItems.Add(tempDT.Rows(x)("Register_Locked").ToString)

                Next
            Else
                lblEmptyString.Visible = True
            End If
            dsStoreDetail.Clear()
            tempDT = Nothing

        Catch ex As Exception
            CreateLog("Module: LoadStoreData()" & vbNewLine & "Exception Error: " & ex.Message)
            MsgBox("Exception Error: " & ex.Message, MsgBoxStyle.Critical, "Module: LoadStoreData()")
            lblEmptyString.Visible = True
        End Try

我已将所有列表视图控件设置为 FullRowSelect = True 但仅在设计时 - 不确定这是否重要。

【问题讨论】:

  • 我建议您一次只提出一个问题。这样你就更有可能得到答案。因为知道一个答案的人可能不知道另一个答案。而且由于他们不太可能只用一个答案就得到“接受的回应”,所以他们什么也没说。

标签: vb.net listview


【解决方案1】:

好吧,这是我的结论,恐怕它会用与你的名字不同的东西来做。

首先,将所有 ListView 设置为具有这些设置:

HideSelection = True
MultiSelect = false

这是我在所有 ListViews 中放置的选定索引已更改。

Private Sub ListView2_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListView2.SelectedIndexChanged
    If Not Working And ListView2.SelectedIndices.Count <> 0 Then
       UpdateAllListViewes(ListView2.SelectedIndices)
    End If
End Sub

Working 是一个私有布尔值,用于避免对 UpdateAllListViews 函数的不必要调用。 UpdateAllListViews 将所有列表框发送到 UpdateSelectedIndex 函数,并带有要点亮的索引。如您所见,Working Boolean 在执行时更新为 True。这可以跳过,但如果出现问题,调试将变成一场噩梦。

Private Sub UpdateAllListViewes(ByVal Indexes As ListView.SelectedIndexCollection)
        Working = True
        UpdateSelectedIndex(ListView2, Indexes(0))
        UpdateSelectedIndex(ListView3, Indexes(0))
        UpdateSelectedIndex(ListView4, Indexes(0))
        UpdateSelectedIndex(ListView5, Indexes(0))
        Working = False
    End Sub

最后如何更新选定的索引:

Private Sub UpdateSelectedIndex(ByVal lv As ListView, ByVal Index As Integer)
    For i As Integer = 0 To lv.Items.Count - 1
        If i = Index Then
            lv.Items(i).Selected = True
            lv.Items(i).BackColor = Color.DodgerBlue
            lv.Items(i).ForeColor = Color.White
        Else
            lv.Items(i).Selected = False
            lv.Items(i).BackColor = Color.White
            lv.Items(i).ForeColor = Color.Black
        End If
    Next
End Sub

DodgerBlue 是 ListView 的 SelectedIndex 颜色。这应该可以解决问题 1 和 2。

【讨论】:

  • 非常感谢您的回复,非常抱歉在一个主题下包含两个问题。我会记住这一点,以备不时之需。除了一个小问题外,您上面的示例很有效...当我单击列表视图时,它将选择该列表视图中的整行,但仅选择其他列中的第一列。因此,我最终不会选择完整的行,而是选择所有行中的位。
  • “FullRowSelect”是否全部为真?
  • 是的。如果我单击特定的列表视图,它将突出显示整行 - 当我单击不同的列表视图时,它只会突出显示单元格 1。要截屏吗?
  • 是的,最好是包含您如何设置 ListViewItem 的代码
  • 感谢 WozzeC。我已经更新了我的线程。我忘了提到的一件事是我的列表视图设置了 OwnerDrawn=True。我手动填充了 DrawColumnHeader、DrawItem 和 DrawSubItem 例程,但其他一切都是自动的。
【解决方案2】:

我发现其他答案很有用,但尝试了另一种方式,并以这种简单的方式建立了有用的方法:

Private Sub ListView2_ItemSelectionChanged(sender As Object, e As ListViewItemSelectionChangedEventArgs) Handles ListView2.ItemSelectionChanged
    If Not (e.IsSelected) Then
        ListView3.Items(e.ItemIndex).BackColor = Color.White
        ListView4.Items(e.ItemIndex).BackColor = Color.White
        ListView5.Items(e.ItemIndex).BackColor = Color.White
    Else
        ListView3.Items(e.ItemIndex).BackColor = Color.LightSkyBlue
        ListView4.Items(e.ItemIndex).BackColor = Color.LightSkyBlue
        ListView5.Items(e.ItemIndex).BackColor = Color.LightSkyBlue
    End If

End Sub

每次你在列表视图中选择一个项目时,代码都会点亮同一索引中的其他列表视图项目。

例如Handles ListView2.ItemSelectionChanged 处理事件。

Not (e.IsSelected) 询问选择的类型。

那你给个颜色ListView3.Items(e.ItemIndex).BackColor = Color.LightSkyBlue

函数.IsSelected 返回一个布尔值,表示“它被选中,或者它未被选中”之类的动作,你只需要为最近未选中的项目赋予旧颜色......并为新选择赋予新颜色。祝你好运!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-01
    • 2021-04-09
    • 1970-01-01
    • 2013-04-18
    • 2022-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多