将文本颜色分配给各个下拉框列表项

时间:2012-04-18 01:02:32

标签: vb.net winforms visual-studio-2010

这是VB中的WinForms应用程序。在我的应用程序中,我试图让用户更容易根据项目文本颜色快速选择列表中的项目。所以我试图使用select case语句为每个项目分配颜色,如下所示...问题是我收到一条错误,说'找不到类型'String'上的'公共成员'属性'。“ VB使用此错误标记带有Attribute.Add参数的行。这是我目前拥有的代码...

   For Each u In _units
                _counter += 1
                u_lookupNumber_box.Items.Add((Convert.ToString(u.UnitId)) + " - " + (Convert.ToString(u.perMonthCost)))
                Select Case u.occupied
                    Case Is = 0
                        u_lookupNumber_box.Items(_counter - 1).Attributes.add("style", "color: Yellow")
                    Case Is = 1
                        u_lookupNumber_box.Items(_counter - 1).attributes.add("style", "color: Green")
                    Case Is = 2
                        u_lookupNumber_box.Items(_counter - 1).attributes.add("style", "color: Red")
                    Case Is = 3
                        u_lookupNumber_box.Items(_counter - 1).attributes.add("style", "color: Blue")
                    Case Is = 4
                        u_lookupNumber_box.Items(_counter - 1).attributes.add("style", "color: Orange")
                    Case Is = 5
                        u_lookupNumber_box.Items(_counter - 1).attributes.add("style", "color: Purple")
                End Select
            Next

为什么我收到此错误的任何想法?我确实注意到当我点击“。”时我执行了.attributes部分。并键入“att”它没有出现在vb的智能框中。这让我觉得我需要先将某些名称“属性”分配给下拉框..感谢您提供的帮助......

应该注意的是,u_lookupNumber_box是我表单上下拉框的名称..

2 个答案:

答案 0 :(得分:1)

attributes不是ListBox.Items属性的方法。查看ListBox.ObjectCollection类文档,它提供了OwnerDrawn ListBox的示例。我相信这或类似的东西将是你唯一的选择。

答案 1 :(得分:1)

好吧这是一个很长的面包屑搜索和一些试验和错误的痕迹,我让它完全工作...由于drawItem事件arg的不断处理我不是很满意它,但除此之外它的工作原理正如预期的......首先,我将下拉列表的DrawMode属性设置为OwnerDrawFixed。然后在我的表单类中创建了一个结构:

Public Structure ColoredUnitItem
    Dim text As String
    Dim color As Color
    Dim bold As Boolean
    Public Overrides Function ToString() As String
        Return text
    End Function
End Structure

这实际上会包含每个项目的所有属性..

接下来,我将原始发布的代码更改为以下内容:

For Each u In _units
                _counter += 1
                Dim myItem As New ColoredUnitItem
                With myItem
                    .text = (Convert.ToString(u.UnitId)) + " - " + (Convert.ToString(u.perMonthCost))
                    Select Case u.occupied
                        Case Is = 0
                            .color = Color.Yellow
                        Case Is = 1
                            .color = Color.Green
                        Case Is = 2
                            .color = Color.Red
                        Case Is = 3
                            .color = Color.Blue
                        Case Is = 4
                            .color = Color.Orange
                        Case Is = 5
                            .color = Color.Purple
                    End Select
                End With
                u_lookupNumber_box.Items.Add(myItem)
            Next

接下来,我只需要在表单上绘制下拉列表,如下所示:

Private Sub uLookUpNumberBox_Draw(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles u_lookupNumber_box.DrawItem
    e.DrawBackground()
    If Not e.Index = -1 Then
        Dim myItem As ColoredUnitItem = DirectCast(u_lookupNumber_box.Items(e.Index), ColoredUnitItem)
        Dim FontToUse As Font = e.Font
        If myItem.bold Then
            FontToUse = New Font(e.Font, FontStyle.Bold)
        End If
        e.Graphics.DrawString(myItem.text, FontToUse, New SolidBrush(myItem.color), e.Bounds)
        e.DrawFocusRectangle()
    End If
End Sub

流程很容易遵循并且确实有效。

相关问题