【问题标题】:Categorize Listbox items by Color按颜色对列表框项目进行分类
【发布时间】:2014-11-06 14:53:36
【问题描述】:

所以我正在尝试制作一个带有 2 个按钮的列表框。 列表框应该显示来自特定文件夹的文件(我回到这个) 并且这两个按钮应该被称为“设置..”(在设置目录中) 和更新(因为列表将被刷新(我每次 Windows 窗体运行时都会做的事情。

所以到目前为止,当我启动我的应用程序并转到带有列表框的表单时,列表框是空的。当按下“更新”时,列表框会从位于我的硬盘驱动器上的地址中提取文件(所以这是位于我的代码中的静态地址)。

它还找到 7 个不同的扩展名(文件类型),并正确列出所有这些。

我的问题如下,我希望设置按钮在首次运行时为用户打开一个文件对话框,这样用户自己可以选择程序“索引或搜索”的文件夹。然后当他再次运行应用程序时,发现列表框,他只能按更新,列表框显示他上次选择的文件夹的内容。

Set - 按钮现在在我的代码中没有任何作用。

其次,我希望每个文件类型都用特定颜色标记或着色。

喜欢; .txt 应该是蓝色的,.jpg 是红色的,等等。

如果有帮助,请运行 Visual Studio 2013。

另外,在检查我的代码时,如果您也有任何建议,我可以如何改进代码,使其更简单,更短,并且只是为了避免重复代码而进行更改,请告诉我。

这是来自 VS2013 中的设计

代码:

Private Sub Form_Load(sender As Object, e As EventArgs) Handles Me.Load

FolderBrowserDialog1.SelectedPath = "xxx\xxx\xxx\xxx"
        System.IO.Directory.GetCurrentDirectory()

 Private Sub updateButtonGame_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles updateButtonGame.Click
        If FolderBrowserDialog1.SelectedPath = "xxx\xxx\xxx\xxx" Then

            ListFiles(FolderBrowserDialog1.SelectedPath)

        End If
    End Sub

    Private Sub ListFiles(ByVal folderPath As String)
        filesListBox.Items.Clear()

        Dim fi = From f In New IO.DirectoryInfo(FolderBrowserDialog1.SelectedPath).GetFiles().Cast(Of IO.FileInfo)() _
                  Where f.Extension = ".z64" OrElse f.Extension = ".nds" OrElse f.Extension = ".BIN" OrElse f.Extension = ".smc" OrElse f.Extension = ".ISO" OrElse f.Extension = ".nes" OrElse f.Extension = ".gb"
                  Order By f.Extension
                  Select f

        For Each fileInfo As System.IO.FileInfo In fi
            filesListBox.Items.Add(fileInfo.Name)
        Next

    End Sub

另一件事,这是更多可选的..

我的列表是全黑的,所以我选择让列表框中的“项目”变成浅灰色。

我玩弄了一个叫做 e.Graphics 的东西,希望能够为特定的文件类型着色,它把所有的项目变成黑色、红色,或者我把它变成的任何东西。 但是去掉代码后,所有的Item都变成了和Listbox的Background颜色一样的颜色。所以我再也看不到实际存在的元素,除了侧面弹出的滚动条(因为我选择的文件夹中有很多项目)

另外,我还不太擅长编码/视觉工作室,因为我大约在 1 周前开始工作。 从 VB 2010 开始,然后去 VS2013 看看我是否设法解决了一些问题,也与列表框有关。

如果我解释得不好,请告诉我,我会更新更好的信息。 项目也是首先在 VB 2010 中创建的,然后在 VS 2013 中“迁移”或打开。

【问题讨论】:

  • 列表框必须是OwnerDraw,并使用DrawItem 来根据需要更改每个项目的背景色。
  • OwnerDraw?固定还是可变?他们是我在这里得到的两个选择。我以前在 Normal 上使用它,但是当我尝试 e.Graphics 解决方案时,它写道我必须将其更改为 OwnerDrawFixed。当您说 Backcolor 时,您是指每个项目的文本颜色,还是文本周围的颜色?
  • 仔细查看您在e 中看到的丰富 参数集。此外,您可能还想查看一些其他拥有 ListViews 的帖子。 (通常比 ListBox 更好的选择,顺便说一句)。这里有几个链接:A nice ListView,或thisthat one..
  • 你说你想要它们to be labeled or colored with a specific color', I dont know if that means fore or backcolor. You probably want OwnerDrawFixed as log as each item is the same size, otherewise do as TaW suggests and examine e`,它会告诉你当前正在绘制哪个项目。用它来确定颜色。
  • 对不起,我在考虑前色,因为它被称为。它实际上可以是任何一个,只要它将它们分开即可。假设您在该列表中有 10.txt 文件和 15.jpg 文件,然后我希望能够将 .txt 文件设置为具有前色或背景色为红色或其他任何颜色,然后将 .jpg 设置为不同的颜色,因此您可以轻松滚动并查看内容。如果您有分步指南或一些代码来指导我,请发布它,因为我是空白的。我不知道如何进行。我已经启动并运行了列表视图,它可以找到我想要的文件。

标签: vb.net winforms listbox


【解决方案1】:

一个更好的方法是使用ListViewImageList 在列表中包含一些标准图像,用于文本、图像、PDF 等,然后在添加时为每个项目设置图像键他们到名单上。

或者,您可以在列表框中模拟相同的内容(使用OwnerDrawFixed)来绘制指定的图像以指示文件类型。实现这一点的一个非常好的方法是使用类似于下面的代码作为起点的ExtenderProvider。作为 EP,您可以将任何 cbo 或列表框链接到图像列表,以提供非常类似于 ListView 作品的图像提示:

你不经常看到你的有色物品习语的原因是你选择的任何颜色都不会在所有系统上看起来都是正确的。颜色越多,它们就越有可能和更经常地没有足够的对比度,不适合用户的配色方案等。您也不需要“图例”来解释颜色的含义——图像是不言自明的。也就是说,DrawItem 代码是这样的:

注意:列表框控件设置为OwnerDrawFixedItemHeight = 16

Private Sub lb_DrawItem(sender As Object, 
           e As DrawItemEventArgs) Handles lb.DrawItem

    Dim TXT As Color = Color.Black
    Dim JPG As Color = Color.Green
    Dim PDF As Color = Color.Blue
    Dim EXE As Color = Color.Gray
    Dim SEL As Color = SystemColors.HighlightText
    Dim thisColor As Color = Color.Orange

    Dim ndx As Integer = e.Index

    ' isolate ext ans text to draw
    Dim text As String = lb.Items(ndx).ToString()
    Dim ext As String = System.IO.Path.GetExtension(text).ToLowerInvariant

    ' dont do anything if no item being drawn
    If ndx = -1 Then Exit Sub

    ' default
    e.DrawBackground()

    ' color selector
    Select Case ext
        Case ".jpg"
            thisColor = JPG
        Case ".txt"
            thisColor = TXT
        Case ".exe"
            thisColor = EXE
        Case ".pdf"
            thisColor = PDF
    End Select

    ' override color to use default when selected
    If (e.State And DrawItemState.Selected) = DrawItemState.Selected Then
        thisColor = SEL
    End If

    ' render the text
    TextRenderer.DrawText(e.Graphics, text, lb.Font, e.Bounds, 
               thisColor, TextFormatFlags.Left)

    ' default
    e.DrawFocusRectangle()

End Sub

结果:

在我的系统上工作TM

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-05
    • 2021-11-14
    • 2011-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多