同时选择多个listview控件的同一行

时间:2014-03-31 04:06:54

标签: vb.net listview

在我的应用程序中,我有一个包含5个不同listview控件的表单。我想在这里做两件事,我已经变得有点困惑......

1。当我点击Listview1的第3行(例如)时,我是否可以这样做,它为所有listview控件选择第3行?我在Listview1的_SelectedIndexChanged事件中设置了以下代码,它可以正常工作,但是,如果用户点击任何列表视图的第3行,我想这样做,它会将所有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. 我有没有办法让所有listview控件都将高亮显示条作为活动颜色?目前,它仅显示具有蓝色高亮条的聚焦列表视图控件,而其他颜色为暗灰色。我想(如果可能的话)所有listview控件都显示为蓝色,无论它是否有焦点。

任何帮助表示赞赏。 感谢

更新 listview控件的多个选择现在按要求工作,但是,一旦listview失去焦点,它只会保持第一个单元格突出显示如下所示:

enter image description here

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

        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

我已将所有listview控件设置为FullRowSelect = True,但仅限于设计时 - 不确定是否重要。

2 个答案:

答案 0 :(得分:0)

是的,这是我对此的结论,它会以与你不同的名字制作,我很害怕。

要开始,请设置所有ListView以进行设置:

HideSelection = True
MultiSelect = false

这是我在所有ListViews中选择的Index已更改的内容。

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是一个Private Boolean,用于避免对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.

答案 1 :(得分:0)

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

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

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

例如Handles ListView2.ItemSelectionChanged处理事件。

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

然后你给出一个颜色ListView3.Items(e.ItemIndex).BackColor = Color.LightSkyBlue

函数.IsSelected返回一个布尔值,表示“它被选中,或者未被选中”这样的动作,你只需要将旧颜色赋予反复选择的未选项......并为新选择添加新颜色。祝你好运!!