这是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是我表单上下拉框的名称..
答案 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
流程很容易遵循并且确实有效。