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

Vb.net 按颜色对列表框项目进行分类,vb.net,winforms,listbox,Vb.net,Winforms,Listbox,所以我想制作一个有两个按钮的列表框。 Listbox应该显示特定文件夹中的文件(我回到这里) 这两个按钮应该被称为“Set..”(如Set目录中所示) 和更新(因为列表将被刷新)(我每次运行Windows窗体时都会这样做) 现在,当我启动我的应用程序并使用列表框进入表单时,列表框是空的。当按下“更新”时,列表框从位于我硬盘上的地址(因此这是位于我代码中的静态地址)拾取文件 它还可以找到7种不同的扩展名(文件类型),并正确列出所有扩展名 我的问题如下,我希望set按钮在第一次运行时为用户打开一个文

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

现在,当我启动我的应用程序并使用列表框进入表单时,列表框是空的。当按下“更新”时,列表框从位于我硬盘上的地址(因此这是位于我代码中的静态地址)拾取文件

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

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

设置按钮现在在我的代码中没有任何作用

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

比如;.txt应该是蓝色的,.jpg是红色的,等等

运行Visual Studio 2013(如果有帮助的话)

此外,在检查我的代码时,如果您也有任何建议,我如何改进代码,使其更简单、更简短,并且只是为了更改内容以避免重复代码,请让我知道

以下是VS2013中的设计

代码:

另一件事,这是更多的选择

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

我玩了一个叫做e.Graphics的东西,希望能给一个特定的文件类型着色,它把所有的项目都变成了黑色、红色或者我放的任何东西。 但删除代码后,所有项目都变成与列表框背景颜色相同的颜色。因此,除了侧边弹出的滚动条外,我再也看不到实际存在的元素(因为我选择的文件夹中有许多项目)

另外,我还不太擅长编码/visual studio,因为我大约在一周前就开始了。 从VB 2010开始,然后转到VS2013,看看我是否解决了一些问题,也与列表框有关

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

更好的方法是使用
列表视图和
图像列表
,列表中包含一些文本、图像、PDF等的标准图像,然后在将它们添加到列表中时为每个项目设置图像键

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

您不经常看到彩色物品习惯用法的原因是,您选择的任何颜色都不会在所有系统上都正确显示。颜色越多,就越有可能和更经常地与用户的配色方案没有足够的对比度、可读性等。您也不需要“图例”为了解释颜色的含义-图像是不言自明的。也就是说,
DrawItem
代码如下:

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

Private Sub lb_DrawItem(发送方作为对象,
e作为DrawItemEventArgs)处理lb.DrawItem
Dim TXT As Color=Color.Black
将JPG调暗为Color=Color.Green
调暗PDF为Color=Color.Blue
Dim EXE As Color=Color.Gray
将选择变暗为颜色=SystemColors.HighlightText
将此颜色调暗为Color=Color.Orange
尺寸ndx为整数=e.索引
'隔离要绘制的文本
将文本标注为字符串=lb.Items(ndx).ToString()
Dim ext As String=System.IO.Path.GetExtension(text.ToLowerInvariant)
“如果没有绘制任何项目,请不要执行任何操作
如果ndx=-1,则退出Sub
"违约",
e、 退税地()
'颜色选择器
选择案例分机
案例“.jpg”
thisColor=JPG
大小写“.txt”
thisColor=TXT
大小写“.exe”
thisColor=EXE
案例“.pdf”
thisColor=PDF
结束选择
'选择时覆盖颜色以使用默认值
如果(e.State和DrawItemState.Selected)=DrawItemState.Selected,则
此颜色=SEL
如果结束
'渲染文本
TextRenderer.DrawText(如图形、文本、磅字体、边界、,
thisColor,TextFormatFlags.Left)
"违约",
e、 DrawFocusRectangle()
端接头
结果:


在我的系统上工作TM

列表框必须是
OwnerDraw
,并使用
DrawItem
根据需要更改每个项目的背景色。OwnerDraw?固定或可变?这是我在这里得到的两个选项。我以前通常使用它,但当我尝试e.Graphics解决方案时,有人告诉我必须将其更改为OwnerDrawFixed.当你说Backcolor时,你是指每个项目的文本颜色,还是文本周围的颜色?仔细看看你在
e
中看到的丰富的参数集。此外,你可能还想看看其他一些拥有Draw ListView的帖子。(通常是比ListBox更好的选择,顺便说一句).这里有一些链接:,或..你说你想让它们
被贴上标签或用特定的颜色着色',我不知道这是指前颜色还是后颜色。你可能想让OwnerDraw固定为日志,因为每个项目都是相同的大小,否则我们就按照TaW的建议去做,然后检查
e',这将告诉你当前正在绘制的项目。使用t确定颜色
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