0

这是 VB 中的 WinForms 应用程序。在我的应用程序中,我试图让用户更容易根据项目文本颜色快速选择列表中的项目。所以我试图使用如下的 select case 语句为每个项目分配颜色......问题是我收到一条错误消息,提示“未找到类型‘字符串’的公共成员‘属性’。” 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 的 intelisense 框中。这让我觉得我需要先以某种方式将名称“attributes”分配给下拉框。感谢所有帮助...

需要注意的是 u_lookupNumber_box 是我表单上下拉框的名称..

4

2 回答 2

1

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

于 2012-04-18T01:49:47.813 回答
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

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

于 2012-04-18T02:14:05.777 回答