2014-09-12 78 views
1

所以我想用2個按鈕創建一個列表框。 列表框應該顯示來自特定文件夾的文件(我回到這裏) 並且這兩個按鈕應該被稱爲「Set ..」(如在設置目錄中) 和Update(當列表將被刷新(因此,當我開始我的應用程序並轉到帶有列表框的窗體時,列表框是空的,當按下「更新」按鈕時,列表框顯示出來從位於我的硬盤地址文件(所以這是坐落在我的代碼靜態地址)。按顏色對列表框項目進行分類

它還發現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看看我是否設法解決一些問題,也與列表框有關。

如果我解釋得很差,讓我知道,我會更新更好的信息。 項目也是在VB 2010中首次創建,然後「遷移」或在VS 2013中打開。

+1

列表框必須是'OwnerDraw',並使用'DrawItem'來更改每個項目所需的背景顏色。 – Plutonix 2014-09-12 12:20:34

+0

OwnerDraw?固定或可變?他們是我在這裏得到的兩個選擇。我曾經在Normal上使用它,但是當我嘗試e.Graphics解決方案時,寫到我必須將其更改爲OwnerDrawFixed。 當您說Backcolor時,是指每個項目的文本顏色,還是文本週圍的顏色? – PiperMp3 2014-09-12 12:28:27

+0

仔細看看你在'e'中看到的__ rich__參數集。你也可以看看ownerdraw ListViews的其他一些帖子。 (通常比ListBox更好的選擇,順便說一句)。這裏有幾個鏈接:[一個很好的ListView](http://stackoverflow.com/questions/25758052/nice-options-style-winforms-dialog-control/25761497#25761497)或[this](http:// stackoverflow.com/questions/24228379/listview-control-like-in-windows-explorer/24229846#24229846)或[that one](http://stackoverflow.com/questions/24569436/how-to-color-particular-項目的組合框/ 24598785#24598785).. – TaW 2014-09-12 13:35:04

回答

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

相關問題