2014-03-31 48 views
0

在我的應用程序中我有一個包含5個不同的listview控件的表單。我試圖在這裏實現兩件事情,我已經變得有點卡...同時選擇同一行多個listview控件

1.有沒有一種方法,我可以讓它,所以當我點擊第3行(例如)Listview1,它爲所有listview控件選擇第3行?我有下面的代碼在我的是ListView1事件_SelectedIndexChanged其工作正常設置,但是,我希望把它因此,如果用戶點擊任何列表視圖的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.有沒有一種方法,我可以使它所以所有的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,但只在設計時 - 不知道是否重要。

+0

我建議你一次只提出一個問題。這樣你更可能得到答案。因爲知道一個答案的人可能不知道另一個答案。而且,由於他們不太可能獲得「接受答覆」,只有一個答案,他們什麼也沒說。 – WozzeC

回答

0

對,這是我對此的結論,恐怕我的命名與你的命名不同。

要開始,設置所有列表視圖有theese設置:

HideSelection = True 
MultiSelect = false 

這是我放在選定的所有列表視圖索引改變。

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函數,索引點亮。正如你所看到的,工作布爾值在執行時更新爲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 

寶藍是一個ListView的SelectedIndex的顏色。這應該解決問題1和2。

+0

非常感謝您的答覆,並非常抱歉在一個主題下包含兩個問題。我會爲將來記住這一點。你的上面的例子除了一個小問題之外,還有其他作用......當我點擊列表視圖時,它將選擇該列表視圖中的整個行,但只選擇其他列中的第一列。所以我不會選擇一個完整的行,只能從所有行中選擇。 – Riples

+0

「FullRowSelect」是否全部都是真的? – WozzeC

+0

是的。如果我點擊一個特定的列表視圖,它會突出顯示整行 - 當我點擊不同的列表視圖時,它只突出顯示單元格1。你想要一個屏幕截圖嗎? – Riples

0

我發現有用別人的答案,但嘗試另一種方式,並創辦有用這種方式簡單it's:

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 

對於每一個U ON列表視圖中選擇某一項,代碼將時間點亮同一索引中的其他列表視圖項目。

例如Handles ListView2.ItemSelectionChanged處理事件。

Not (e.IsSelected)要求選擇的類型。

然後你給一個顏色ListView3.Items(e.ItemIndex).BackColor = Color.LightSkyBlue

功能.IsSelected返回表示類似的行動「選中它,或者它未選中」一個布爾值,那麼你只需要給舊的顏色resently非選擇項目..和新選擇的新顏色。祝你好運!!

相關問題