按颜色对列表框项目进行分类

时间:2014-09-12 12:11:46

标签: vb.net winforms listbox

所以我试图用2个按钮制作一个列表框。 列表框应该显示特定文件夹中的文件(我回到这里) 这两个按钮应该被称为“Set ..”(在set目录中) 和更新(因为列表将刷新(每次Windows窗体运行时我都会做的事。

截至目前,当我启动应用程序并转到带有列表框的表单时,列表框为空。当按下“更新”时,列表框从我的Harddrive上的地址中选取文件(所以这是我代码中的静态地址)。

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

我的问题如下,我希望设置按钮在首次运行时为用户打开文件对话框,因此用户自己可以选择程序“索引或搜索”的文件夹,如果你愿意的话。然后当他再次运行应用程序并找到列表框时,他只能按下更新,列表框会显示他上次选择的文件夹的内容。

Set - 按钮现在我的代码中没有做任何事情。

第二,我希望每种文件类型都用特定颜色标记或着色。

像; .txt应为蓝色,.jpg为红色,等等。

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

此外,在检查我的代码时,如果您有任何建议,我如何改进代码,使其更容易,更短,只是为了避免重复代码而改变,请告诉我。

这是来自VS2013中的设计

enter image description here

代码:

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的东西,希望实现Coloring一个特定的文件类型,并且它将所有项目变为黑色,红色或我所说的任何东西。 但删除代码后,所有项目将变为与列表框的背景颜色相同的颜色。所以我再也看不到实际存在的元素,除了侧面弹出的滚动条(因为我选择的文件夹中有很多项目)

此外,我对编码/视觉工作室还不是很好,因为我在1周前就开始了。 从VB 2010开始,然后去VS2013,看看我是否设法修复了一些问题,也与List Box有关。

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

1 个答案:

答案 0 :(得分:3)

更好,更好的方法是使用ListViewImageList在列表中添加文本,图像,PDF等标准图像,然后为每个设置图像键将它们添加到列表中的项目。

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

enter image description here

您经常看不到您的彩色项目的原因是,您选择的任何颜色在所有系统上看起来都不正确。颜色越多,他们就越不可能拥有足够的对比度,使用用户的颜色方案可读性等。您也不需要“图例”来解释颜色的含义 - 图像是自我解释的。也就是说,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

结果:

enter image description here

适用于我的系统 TM