2015-04-22 47 views
1

我想更改ListView中的選擇顏色,從默認(藍色)。我無法適應任何我發現符合我需要的代碼。Listview - 多列 - 更改整行的選擇顏色

這是最接近的代碼。

If e.Item.Selected = True Then 
     e.Graphics.FillRectangle(New SolidBrush(Color.Gray), e.Bounds) 
     TextRenderer.DrawText(e.Graphics, e.Item.Text, New Font(ListView2.Font, Nothing), New Point(e.Bounds.Left + 3, e.Bounds.Top + 2), Color.White) 
    Else 
     e.DrawDefault = True 
    End If 

主要問題是e.Item.Text部分。它不適用於多列listview。結果如下。

選擇之前: enter image description here

...之後: enter image description here

是否可以保留其他列的值,並有仍然充滿行選擇?

謝謝。

回答

2

要記住用的OwnerDraw Listview的事情是,有2事件來回應(或覆蓋,如果你繼承)如果控制詳細ViewDrawColumnHeaderDrawSubItem

DrawItem將在控件使用不同的View時使用,並且沒有SubItems繪製。

由於SubItems(0)Item.Text相同,因此您可以使用DrawSubItem來繪製項目和子項目文本。我不知道哪裏該片段的位置,但是這將工作:

Private Sub lv1_DrawSubItem(sender As Object, 
     e As DrawListViewSubItemEventArgs) Handles lv1.DrawSubItem 

    ' use sender instead of a hardcodes control ref so 
    ' you can paste this to another LV 
    Dim myLV As ListView = CType(sender, ListView) 

    If e.ItemIndex > 0 AndAlso e.Item.Selected Then 
     Using br As New SolidBrush(Color.Gray) 
      e.Graphics.FillRectangle(br, e.Bounds) 
     End Using 

     Using fnt As New Font(myLV .Font, Nothing) 
     ' use e.SubItem.Text 
      TextRenderer.DrawText(e.Graphics, e.SubItem.Text, 
          fnt, 
          New Point(e.Bounds.Left + 3, e.Bounds.Top + 2), 
          Color.White) 
     End Using  ' dispose! 
    Else 
     e.DrawDefault = True 
    End If 

End Sub 

這樣看來,你可能會使用正確的事件,但是通過使用Item.Text而不是e.SubItem.Text項文本也將被繪製所有子項目(DrawSubItem將被多次調用,因爲有子項目)。

請注意,我還將Font包裝在Using塊中以處置它。使用暗綠,結果:

enter image description here

+0

謝謝Plutonix,你幫了我很多。 – Jovica