I am a newbie when it comes to visual basic. I am using visual basic 2010 express and I am trying to write a program that will allow my users to search for any text case insensitive in all tree nodes and their corresponding listview items. I have google'd around the internet trying to find anything that might help me to get this accomplished but I am not at a lost. Can someone please offer me some advice. I have posted my code below so everyone can analyze it and see where I may need to change some things. Thanks to anyone in advance that is willing to help me out on this.
Code:
Option Compare Text
Imports System.IO
Imports System.Runtime.InteropServices
Imports System.Windows.Forms
Public Class Form1
Private Structure SHFILEINFO
Public hIcon As IntPtr ' : icon
Public iIcon As Integer ' : icondex
Public dwAttributes As Integer ' : SFGAO_ flags
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=260)> _
Public szDisplayName As String
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=80)> _
Public szTypeName As String
End Structure
Private Declare Auto Function SHGetFileInfo Lib "shell32.dll" _
(ByVal pszPath As String, _
ByVal dwFileAttributes As Integer, _
ByRef psfi As SHFILEINFO, _
ByVal cbFileInfo As Integer, _
ByVal uFlags As Integer) As IntPtr
Private Const SHGFI_ICON = &H100
Private Const SHGFI_SMALLICON = &H1
Private Const SHGFI_LARGEICON = &H0 ' Large icon
Private Const MAX_PATH = 260
Private Sub AddImages(ByVal strFileName As String)
Dim shInfo As SHFILEINFO
shInfo = New SHFILEINFO()
shInfo.szDisplayName = New String(vbNullChar, MAX_PATH)
shInfo.szTypeName = New String(vbNullChar, 80)
Dim hIcon As IntPtr
hIcon = SHGetFileInfo(strFileName, 0, shInfo, Marshal.SizeOf(shInfo), SHGFI_ICON Or SHGFI_SMALLICON)
Dim MyIcon As Drawing.Bitmap
MyIcon = Drawing.Icon.FromHandle(shInfo.hIcon).ToBitmap
ImageList1.Images.Add(strFileName.ToString(), MyIcon)
End Sub
Private Sub AddAllFolders(ByVal TNode As TreeNode, ByVal FolderPath As String)
Try
For Each FolderNode As String In Directory.GetDirectories(FolderPath)
Dim SubFolderNode As TreeNode = TNode.Nodes.Add(FolderNode.Substring(FolderNode.LastIndexOf("\"c) + 1))
SubFolderNode.Tag = FolderNode
' SubFolderNode.Nodes.Add("Loading...")
Next
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
Private Sub Treeview1_AfterSelect(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles TreeView1.AfterSelect
Dim FileExtension As String
Dim SubItemIndex As Integer
Dim DateMod As String
ListView1.Items.Clear()
If TreeView1.SelectedNode.Nodes.Count = 1 AndAlso TreeView1.SelectedNode.Nodes(0).Text = "Loading..." Then
TreeView1.SelectedNode.Nodes.Clear()
AddAllFolders(TreeView1.SelectedNode, CStr(TreeView1.SelectedNode.Tag))
End If
Dim folder As String = CStr(TreeView1.SelectedNode.Tag)
If Not folder Is Nothing AndAlso IO.Directory.Exists(folder) Then
Try
For Each file As String In IO.Directory.GetFiles(folder)
'For Each file As String In IO.Directory.GetFiles("*.pdf")
FileExtension = IO.Path.GetExtension(file & ".pdf")
DateMod = IO.File.GetLastWriteTime(file).ToString()
AddImages(file)
If file.Contains(".pdf") OrElse file.Contains(".doc") OrElse file.Contains(".xls") Then
ListView1.Items.Add(file.Substring(file.LastIndexOf("\"c) + 1), file.ToString())
ListView1.Items(SubItemIndex).SubItems.Add(FileExtension.ToString() & " File")
ListView1.Items(SubItemIndex).SubItems.Add(DateMod.ToString())
SubItemIndex += 1
Else
End If
Next
Catch ex As Exception
MsgBox(ex.Message)
End Try
End If
End Sub
Private Sub Treeview1_BeforeExpand(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TreeViewCancelEventArgs) Handles TreeView1.BeforeExpand
If e.Node.Nodes.Count = 1 AndAlso e.Node.Nodes(0).Text = "Loading..." Then
e.Node.Nodes.Clear()
AddAllFolders(e.Node, CStr(e.Node.Tag))
End If
End Sub
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
RadioButton1.Checked = True
TreeView1.Nodes.Clear()
TreeView1.Sort()
Dim Tnode As TreeNode = TreeView1.Nodes.Add("(Customer Images)")
AddAllFolders(Tnode, "\\sever\share1")
ListView1.View = View.Details
' Add a column with width 80 and left alignment
ListView1.Columns.Add("File Name", 150, HorizontalAlignment.Left)
ListView1.Columns.Add("File Type", 80, HorizontalAlignment.Left)
ListView1.Columns.Add("Date Modified", 150, HorizontalAlignment.Left)
End Sub
Private Sub ClearThumbnails(ByVal cntlThumbnailContainer As ScrollableControl)
Throw New NotImplementedException
End Sub
Private Function AddThumbnail(ByVal cntlThumbnailContainer As ScrollableControl, ByVal p2 As String) As UserControl
Throw New NotImplementedException
End Function
Private Sub SetThumbnailPosition(ByVal tnNewThumbnail As UserControl, ByVal cntlThumbnailContainer As ScrollableControl, ByVal iThumbnailCount As Integer)
Throw New NotImplementedException
End Sub
Private Sub RadioButton1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton1.CheckedChanged
If RadioButton1.Checked = True Then
TreeView1.Nodes.Clear()
Dim Tnode As TreeNode = TreeView1.Nodes.Add("(Customer Images)")
AddAllFolders(Tnode, "\\server\share1")
End If
End Sub
Private Sub RadioButton2_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton2.CheckedChanged
If RadioButton2.Checked = True Then
TreeView1.Nodes.Clear()
Dim Tnode As TreeNode = TreeView1.Nodes.Add("(Purchase Orders)")
AddAllFolders(Tnode, "\\server\share2\folder")
End If
End Sub
Private Sub ListView1_SelectedIndexChanged_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListView1.SelectedIndexChanged
End Sub
Private Sub ListView1_MouseDoubleClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListView1.MouseDoubleClick
Dim OpenFile As String
If RadioButton1.Checked = True Then
OpenFile = "\\server\share1\" + TreeView1.SelectedNode.Text + "\" + ListView1.SelectedItems(0).Text
Process.Start(OpenFile)
'MessageBox.Show(OpenFile)
ElseIf RadioButton2.Checked = True Then
OpenFile = "\\server\share2\folder\" + TreeView1.SelectedNode.Text + "\" + ListView1.SelectedItems(0).Text
Process.Start(OpenFile)
End If
End Sub
Private Sub Button1_Click(ByVal tncol As TreeNodeCollection, ByVal strNode As String)
Dim inputstring As String
Dim lvi As ListViewItem
inputstring = CStr(InputBox("Search for", "Search"))
For Each lvi In ListView1.Items
If lvi.Text = inputstring Then
MessageBox.Show(lvi.Text)
Else
MessageBox.Show("Nothing Found")
End If
Next
End Sub
#Region "Members"
Private currentMathWholeWord As Boolean
Private currentSearchText As String
Private foundNodes As List(Of TreeNode)
Private selectedIndex As Integer
#End Region
#Region "Constructor"
Public Sub New()
InitializeComponent()
Me.currentSearchText = ""
Me.foundNodes = New List(Of TreeNode)
Me.selectedIndex = 0
End Sub
#End Region
#Region "Events"
Private Sub btnClear_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClear.Click
Me.ListBox.Items.Clear()
End Sub
Private Sub btnTravel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTravel.Click
Me.ListBox.Items.Clear()
Dim allNodes As New List(Of TreeNode)
allNodes = Me.FindNodeText(Me.TreeView1, "", False)
Dim tn As TreeNode
For Each tn In allNodes
Me.ListBox.Items.Add(tn.Text)
Next
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If ((Me.currentSearchText <> Me.textBox1.Text) OrElse (Me.currentMathWholeWord <> Me.ckMatchWholeWord.Checked)) Then
Me.currentSearchText = Me.textBox1.Text
Me.currentMathWholeWord = Me.ckMatchWholeWord.Checked
Me.foundNodes.Clear()
Me.foundNodes = Me.FindNodeText(Me.treeView1, Me.currentSearchText, Me.currentMathWholeWord)
Me.selectedIndex = 0
End If
If (Me.selectedIndex < Me.foundNodes.Count) Then
Me.treeView1.SelectedNode = Me.foundNodes.Item(Me.selectedIndex)
Me.selectedIndex += 1
Me.treeView1.Focus()
Else
Me.selectedIndex = 0
End If
End Sub
#End Region
#Region "FindNodeText method"
Private Function FindNodeText(ByVal treeView As TreeView, ByVal nodeText As String, ByVal matchWholeWord As Boolean) As List(Of TreeNode)
Dim lstFoundNode As New List(Of TreeNode)
Dim nodeStack As New Stack(Of TreeNode)
Dim i As Integer = 0
Do While (i < treeView.Nodes.Count)
nodeStack.Push(treeView.Nodes.Item(i))
i += 1
Loop
Do While (nodeStack.Count <> 0)
Dim treeNode As TreeNode = nodeStack.Pop
If matchWholeWord Then
If (treeNode.Text = nodeText) Then
lstFoundNode.Add(treeNode)
End If
ElseIf treeNode.Text.Contains(nodeText) Then
lstFoundNode.Add(treeNode)
End If
For j As Integer = 0 To treeNode.Nodes.Count - 1
nodeStack.Push(treeNode.Nodes.Item(j))
Next j
Loop
Return lstFoundNode
End Function
#End Region
End Class