Quantcast
Channel: VBForums - Visual Basic .NET
Viewing all articles
Browse latest Browse all 27329

Trying to search for a string in all nodes and listview items

$
0
0
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


Viewing all articles
Browse latest Browse all 27329

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>