none
如何設定ComboBox的清單色彩 RRS feed

  • 問題

  • 1. 按下 ComboBox 控制項後會顯示出下拉式清單。
    2.請問該如何變更下拉式清單的背景色彩。不是 BackColor 喔。

    敬請指導,謝謝。
    chian
    2009年2月17日 上午 09:05

解答

  • HI,

    改成這樣就行了:

    Private Sub comboBox1_DrawItem(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles comboBox1.DrawItem  
            Dim lb As ComboBox = CType(sender, ComboBox)  
            If e.Index = -1 Then  
                Return  
            End If  
     
            If sender Is Nothing Then  
                Return  
            End If  
     
            e.DrawBackground()  
            e.DrawFocusRectangle()  
     
            Dim rectPreviewBox As Rectangle = e.Bounds  
            rectPreviewBox.Offset(2, 2)  
            rectPreviewBox.Width = 16 
            rectPreviewBox.Height -4 
            If e.Index Mod 2 = 0 Then  
                e.Graphics.FillRectangle(Brushes.LightCoral, e.Bounds)  
            End If  
            e.Graphics.DrawImage(imageList1.Images(e.Index), rectPreviewBox)  
            e.Graphics.DrawString(lb.Items(e.Index), Font, New SolidBrush(e.ForeColor), e.Bounds.X + 20, e.Bounds.Y + 1)  
     
            If e.State And DrawItemStateDrawItemState.HotLight = DrawItemState.HotLight Then  
                e.DrawBackground()  
                e.DrawFocusRectangle()  
                e.Graphics.DrawImage(imageList1.Images(e.Index), rectPreviewBox)  
                e.Graphics.DrawString(lb.Items(e.Index), Font, New SolidBrush(e.ForeColor), e.Bounds.X + 20, e.Bounds.Y + 1)  
            End If  
    End Sub 

    tihs
    • 已標示為解答 chian 2009年2月20日 上午 01:11
    2009年2月19日 上午 02:55

所有回覆

  •  http://www.csharphelp.com/archives2/archive316.html
    MVP 2009 (ASP.NET), MCPD: ASP.NET Developer 3.5, MCPD: Windows Developer 3.5, MCITP: Database Developer 2008, MCITP: Enterprise Administrator 不想被人認為是小白,就不要總是在做一堆會讓人認為是小白的事。
    • 已標示為解答 chian 2009年2月19日 上午 01:58
    • 已取消標示為解答 chian 2009年2月19日 上午 02:37
    2009年2月17日 上午 10:38
    版主
  • HI,

    如果您是要為ComboBox控制項顯示的項目加上條紋, 可以先將ComboBox控制項的DrawMode屬性設定成OwnerDrawFixed, 再處理ComboBox控制項的DrawItem事件, 請參考:
    Private Sub comboBox1_DrawItem(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles comboBox1.DrawItem  
            Dim lb As ComboBox = CType(sender, ComboBox)  
            If e.Index = -1 Then  
                Return  
            End If  
     
            If sender Is Nothing Then  
                Return  
            End If  
     
            e.DrawBackground()  
            e.DrawFocusRectangle()  
     
            Dim rectPreviewBox As Rectangle = e.Bounds  
            rectPreviewBox.Offset(2, 2)  
            rectPreviewBox.Width = 16 
            rectPreviewBox.Height -4 
            If e.Index Mod 2 = 0 Then  
                e.Graphics.FillRectangle(Brushes.LightCoral, e.Bounds)  
            End If  
                e.Graphics.DrawString(lb.Items(e.Index), Font, New SolidBrush(e.ForeColor), e.Bounds.X + 20, e.Bounds.Y + 1)  
        End Sub 

    tihs
    • 已標示為解答 chian 2009年2月19日 上午 01:58
    • 已取消標示為解答 chian 2009年2月19日 上午 02:37
    2009年2月18日 上午 02:32
  • 1.  感謝指導。
    2. 以您的範例而言,在下拉式清單中,選取項目時會變成沒有選擇列的反白條棒,請問這該如何克服。
    3. 我須要的是為下拉式清單設定背景顏色,但選取項目的反白列須保留。

    敬請再指導,謝囉。
    chian
    2009年2月19日 上午 02:36
  • HI,

    改成這樣就行了:

    Private Sub comboBox1_DrawItem(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles comboBox1.DrawItem  
            Dim lb As ComboBox = CType(sender, ComboBox)  
            If e.Index = -1 Then  
                Return  
            End If  
     
            If sender Is Nothing Then  
                Return  
            End If  
     
            e.DrawBackground()  
            e.DrawFocusRectangle()  
     
            Dim rectPreviewBox As Rectangle = e.Bounds  
            rectPreviewBox.Offset(2, 2)  
            rectPreviewBox.Width = 16 
            rectPreviewBox.Height -4 
            If e.Index Mod 2 = 0 Then  
                e.Graphics.FillRectangle(Brushes.LightCoral, e.Bounds)  
            End If  
            e.Graphics.DrawImage(imageList1.Images(e.Index), rectPreviewBox)  
            e.Graphics.DrawString(lb.Items(e.Index), Font, New SolidBrush(e.ForeColor), e.Bounds.X + 20, e.Bounds.Y + 1)  
     
            If e.State And DrawItemStateDrawItemState.HotLight = DrawItemState.HotLight Then  
                e.DrawBackground()  
                e.DrawFocusRectangle()  
                e.Graphics.DrawImage(imageList1.Images(e.Index), rectPreviewBox)  
                e.Graphics.DrawString(lb.Items(e.Index), Font, New SolidBrush(e.ForeColor), e.Bounds.X + 20, e.Bounds.Y + 1)  
            End If  
    End Sub 

    tihs
    • 已標示為解答 chian 2009年2月20日 上午 01:11
    2009年2月19日 上午 02:55