Jewtus

TreeView Select getting inconsistent results

6 posts in this topic

I'm trying to build a tree view that contains a list of IPs and then when you select one, additional steps are taken with the IP. I found an example of how to read the selected text of a treeview but I keep running into a problem. Sometimes, when I hit the "select" button in my UI, it returns the last record in the list and NOT the record I have selected. The weird part about this is that I've tried this a number of times on several different computers and windows versions and I keep getting the same issue. Sometimes it will ONLY select the last record, sometimes it selects the last record the first time and then starts letting you select, and sometimes it works without issue. Can anyone advise?

Here is an example code block:

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GUITreeView.au3>

NetworkGUI()

Func NetworkGUI($parent = 0)
    $MachineSelectorGUI = GUICreate("Network Check", 616, 500, Default, Default, Default, Default, $parent)
    $idMachineList = GUICtrlCreateTreeView(16, 16, 584, 420)
    $btnSelect = GUICtrlCreateButton("Select", 528, 448, 75, 25)

    ;Menus
    $mFile = GUICtrlCreateMenu("File")
    $mSearchForHosts = GUICtrlCreateMenuItem("Search network for hosts", $mFile)

    GUISetState(@SW_SHOW)
    While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
            Case $GUI_EVENT_CLOSE
                GUIDelete($MachineSelectorGUI)
                ExitLoop
            Case $btnSelect
                $hItem=0
                $hItem=_GUICtrlTreeView_GetSelection($idMachineList)
                If $hItem <> 0 Then
                    $sSelected=_GUICtrlTreeView_GetText($idMachineList, $hItem)
                    MsgBox(0,"",$sSelected)
                Else
                    MsgBox(0,"Oops...","Please select a host to check")
                EndIf
            Case $mSearchForHosts
                Local $aMachines[244]=['192.168.1.1', '192.168.1.2', '192.168.1.3', '192.168.1.4', '192.168.1.5', '192.168.1.6', '192.168.1.7', '192.168.1.8', '192.168.1.9', '192.168.1.10', '192.168.1.11', '192.168.1.12', '192.168.1.13', '192.168.1.14', '192.168.1.15', '192.168.1.16', '192.168.1.17', '192.168.1.18', '192.168.1.19', '192.168.1.20', '192.168.1.21', '192.168.1.22', '192.168.1.23', '192.168.1.24', '192.168.1.25', '192.168.1.26', '192.168.1.27', '192.168.1.28', '192.168.1.29', '192.168.1.30', '192.168.1.31', '192.168.1.32', '192.168.1.33', '192.168.1.34', '192.168.1.35', '192.168.1.36', '192.168.1.37', '192.168.1.38', '192.168.1.39', '192.168.1.40', '192.168.1.41', '192.168.1.42', '192.168.1.43', '192.168.1.44', '192.168.1.45', '192.168.1.46', '192.168.1.47', '192.168.1.48', '192.168.1.49', '192.168.1.50', '192.168.1.51', '192.168.1.52', '192.168.1.53', '192.168.1.54', '192.168.1.55', '192.168.1.56', '192.168.1.57', '192.168.1.58', '192.168.1.59', '192.168.1.60', '192.168.1.61', '192.168.1.62', '192.168.1.63', '192.168.1.64', '192.168.1.65', '192.168.1.66', '192.168.1.67', '192.168.1.68', '192.168.1.69', '192.168.1.70', '192.168.1.71', '192.168.1.72', '192.168.1.73', '192.168.1.74', '192.168.1.75', '192.168.1.76', '192.168.1.77', '192.168.1.78', '192.168.1.79', '192.168.1.80', '192.168.1.81', '192.168.1.82', '192.168.1.83', '192.168.1.84', '192.168.1.85', '192.168.1.86', '192.168.1.87', '192.168.1.88', '192.168.1.89', '192.168.1.90', '192.168.1.91', '192.168.1.92', '192.168.1.93', '192.168.1.94', '192.168.1.95', '192.168.1.96', '192.168.1.97', '192.168.1.98', '192.168.1.99', '192.168.1.100', '192.168.1.101', '192.168.1.102', '192.168.1.103', '192.168.1.104', '192.168.1.105', '192.168.1.106', '192.168.1.107', '192.168.1.108', '192.168.1.109', '192.168.1.110', '192.168.1.111', '192.168.1.112', '192.168.1.113', '192.168.1.114', '192.168.1.115', '192.168.1.116', '192.168.1.117', '192.168.1.118', '192.168.1.119', '192.168.1.120', '192.168.1.121', '192.168.1.122', '192.168.1.123', '192.168.1.124', '192.168.1.125', '192.168.1.126', '192.168.1.127', '192.168.1.128', '192.168.1.129', '192.168.1.130', '192.168.1.131', '192.168.1.132', '192.168.1.133', '192.168.1.134', '192.168.1.135', '192.168.1.136', '192.168.1.137', '192.168.1.138', '192.168.1.139', '192.168.1.140', '192.168.1.141', '192.168.1.142', '192.168.1.143', '192.168.1.144', '192.168.1.145', '192.168.1.146', '192.168.1.147', '192.168.1.148', '192.168.1.149', '192.168.1.150', '192.168.1.151', '192.168.1.152', '192.168.1.153', '192.168.1.154', '192.168.1.155', '192.168.1.156', '192.168.1.157', '192.168.1.158', '192.168.1.159', '192.168.1.160', '192.168.1.161', '192.168.1.162', '192.168.1.163', '192.168.1.164', '192.168.1.165', '192.168.1.166', '192.168.1.167', '192.168.1.168', '192.168.1.169', '192.168.1.170', '192.168.1.171', '192.168.1.172', '192.168.1.173', '192.168.1.174', '192.168.1.175', '192.168.1.176', '192.168.1.177', '192.168.1.178', '192.168.1.179', '192.168.1.180', '192.168.1.181', '192.168.1.182', '192.168.1.183', '192.168.1.184', '192.168.1.185', '192.168.1.186', '192.168.1.187', '192.168.1.188', '192.168.1.189', '192.168.1.190', '192.168.1.191', '192.168.1.192', '192.168.1.193', '192.168.1.194', '192.168.1.195', '192.168.1.196', '192.168.1.197', '192.168.1.198', '192.168.1.199', '192.168.1.200', '192.168.1.201', '192.168.1.202', '192.168.1.203', '192.168.1.204', '192.168.1.205', '192.168.1.206', '192.168.1.207', '192.168.1.208', '192.168.1.209', '192.168.1.210', '192.168.1.211', '192.168.1.212', '192.168.1.213', '192.168.1.214', '192.168.1.215', '192.168.1.216', '192.168.1.217', '192.168.1.218', '192.168.1.219', '192.168.1.220', '192.168.1.221', '192.168.1.222', '192.168.1.223', '192.168.1.224', '192.168.1.225', '192.168.1.226', '192.168.1.227', '192.168.1.228', '192.168.1.229', '192.168.1.230', '192.168.1.231', '192.168.1.232', '192.168.1.233', '192.168.1.234', '192.168.1.235', '192.168.1.236', '192.168.1.237', '192.168.1.238', '192.168.1.239', '192.168.1.240', '192.168.1.241', '192.168.1.242', '192.168.1.243', '192.168.1.244']
                For $x=1 to UBound($aMachines)-1
                    If $aMachines[$x]<>'' then
                        GUICtrlCreateTreeViewItem($aMachines[$x], $idMachineList)
                        GUICtrlSetImage(-1, "shell32.dll", 16)
                    EndIf
                Next
        EndSwitch
    WEnd
EndFunc

 

Share this post


Link to post
Share on other sites



Having a hard time replicating the condition, but I did notice that providing a non-positive integer (<0) to _GetText function seems to return the last item in the list.  Have you checked to make sure that the row/index returned by the _GetSelection is accurate?  

Share this post


Link to post
Share on other sites

#3 ·  Posted (edited)

It happens every couple times I try it, but your suggestion was a good idea. I put a console write in to see what $hItem was getting passed into the GetText function and they are in fact changing:

OUTPUT:
0x0000000CDDA17620
0x0000000CDDBDA300
0x0000000CDDBDA6C0

This is 3 different values I selected, but the msgbox that showed up was still for the last IP in the list.

I also tried changing:

If $hItem <> 0 Then

to

If $hItem > 0 Then

and I still am able to reproduce the issue.

 

I'm going to keep focusing in on the GetText function because clearly that is where the issue is in my script.

EDIT: I added

Case $mTEST
                $input=InputBox("Input hItem","")
                $sSelected=_GUICtrlTreeView_GetText($idMachineList, $input)
                MsgBox(0,"",$sSelected)

to validate the values that write to the console, and when I run the value through the input box... it shows the first record in the list...

 

I've also been able to determine that if I click the Tree view before it finishes adding everything, I'm able to reproduce the issue almost every time.

Edited by Jewtus

Share this post


Link to post
Share on other sites

I think I might know what happened. I put in _beginupdate and _Endupdate (as well as locked the GUI) and I was still able to reproduce the issue, but when I applied images (I was trying to get the error to happen on the examples and was not able to do so) and it fixed the issue. Not exactly sure why, but when I gave the _add function an output variable the problem seemed to go away.

 

#include <GUITreeView.au3>

NetworkGUI()

Func NetworkGUI($parent = 0)
    $MachineSelectorGUI = GUICreate("Network Check", 616, 500, Default, Default, Default, Default, $parent)
    $idMachineList = GUICtrlCreateTreeView(16, 16, 584, 420,BitOR($TVS_EDITLABELS, $TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS),$WS_EX_CLIENTEDGE)

    $g_hImage = _GUIImageList_Create(16, 16, 5, 3)
    _GUIImageList_AddIcon($g_hImage, "shell32.dll", 13)
    _GUIImageList_AddIcon($g_hImage, "shell32.dll", 14)
    _GUICtrlTreeView_SetNormalImageList($idMachineList, $g_hImage)
    $g_hStateImage = _GUIImageList_Create(16, 16, 5, 3)
    _GUIImageList_AddIcon($g_hStateImage, "shell32.dll", 15)
    _GUIImageList_AddIcon($g_hStateImage, "shell32.dll", 23)
    _GUICtrlTreeView_SetStateImageList($idMachineList, $g_hStateImage)

    $btnSelect = GUICtrlCreateButton("Select", 528, 448, 75, 25)

    ;Menus
    $mFile = GUICtrlCreateMenu("File")
    $mSearchForHosts = GUICtrlCreateMenuItem("Search network for hosts", $mFile)

    GUISetState(@SW_SHOW)
    While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
            Case $GUI_EVENT_CLOSE
                GUIDelete($MachineSelectorGUI)
                ExitLoop
            Case $btnSelect
                local $sSelected='',$hItem=0
                $hItem=_GUICtrlTreeView_GetSelection($idMachineList)
                ConsoleWrite($hItem&@CRLF)
                If $hItem <> 0 Then
                    $sSelected=_GUICtrlTreeView_GetText($idMachineList, $hItem)
                    MsgBox(0,"",$sSelected)
                Else
                    MsgBox(0,"Oops...","Please select a host to check")
                EndIf
            Case $mSearchForHosts
                Local $aMachines[244]=['192.168.1.1', '192.168.1.2', '192.168.1.3', '192.168.1.4', '192.168.1.5', '192.168.1.6', '192.168.1.7', '192.168.1.8', '192.168.1.9', '192.168.1.10', '192.168.1.11', '192.168.1.12', '192.168.1.13', '192.168.1.14', '192.168.1.15', '192.168.1.16', '192.168.1.17', '192.168.1.18', '192.168.1.19', '192.168.1.20', '192.168.1.21', '192.168.1.22', '192.168.1.23', '192.168.1.24', '192.168.1.25', '192.168.1.26', '192.168.1.27', '192.168.1.28', '192.168.1.29', '192.168.1.30', '192.168.1.31', '192.168.1.32', '192.168.1.33', '192.168.1.34', '192.168.1.35', '192.168.1.36', '192.168.1.37', '192.168.1.38', '192.168.1.39', '192.168.1.40', '192.168.1.41', '192.168.1.42', '192.168.1.43', '192.168.1.44', '192.168.1.45', '192.168.1.46', '192.168.1.47', '192.168.1.48', '192.168.1.49', '192.168.1.50', '192.168.1.51', '192.168.1.52', '192.168.1.53', '192.168.1.54', '192.168.1.55', '192.168.1.56', '192.168.1.57', '192.168.1.58', '192.168.1.59', '192.168.1.60', '192.168.1.61', '192.168.1.62', '192.168.1.63', '192.168.1.64', '192.168.1.65', '192.168.1.66', '192.168.1.67', '192.168.1.68', '192.168.1.69', '192.168.1.70', '192.168.1.71', '192.168.1.72', '192.168.1.73', '192.168.1.74', '192.168.1.75', '192.168.1.76', '192.168.1.77', '192.168.1.78', '192.168.1.79', '192.168.1.80', '192.168.1.81', '192.168.1.82', '192.168.1.83', '192.168.1.84', '192.168.1.85', '192.168.1.86', '192.168.1.87', '192.168.1.88', '192.168.1.89', '192.168.1.90', '192.168.1.91', '192.168.1.92', '192.168.1.93', '192.168.1.94', '192.168.1.95', '192.168.1.96', '192.168.1.97', '192.168.1.98', '192.168.1.99', '192.168.1.100', '192.168.1.101', '192.168.1.102', '192.168.1.103', '192.168.1.104', '192.168.1.105', '192.168.1.106', '192.168.1.107', '192.168.1.108', '192.168.1.109', '192.168.1.110', '192.168.1.111', '192.168.1.112', '192.168.1.113', '192.168.1.114', '192.168.1.115', '192.168.1.116', '192.168.1.117', '192.168.1.118', '192.168.1.119', '192.168.1.120', '192.168.1.121', '192.168.1.122', '192.168.1.123', '192.168.1.124', '192.168.1.125', '192.168.1.126', '192.168.1.127', '192.168.1.128', '192.168.1.129', '192.168.1.130', '192.168.1.131', '192.168.1.132', '192.168.1.133', '192.168.1.134', '192.168.1.135', '192.168.1.136', '192.168.1.137', '192.168.1.138', '192.168.1.139', '192.168.1.140', '192.168.1.141', '192.168.1.142', '192.168.1.143', '192.168.1.144', '192.168.1.145', '192.168.1.146', '192.168.1.147', '192.168.1.148', '192.168.1.149', '192.168.1.150', '192.168.1.151', '192.168.1.152', '192.168.1.153', '192.168.1.154', '192.168.1.155', '192.168.1.156', '192.168.1.157', '192.168.1.158', '192.168.1.159', '192.168.1.160', '192.168.1.161', '192.168.1.162', '192.168.1.163', '192.168.1.164', '192.168.1.165', '192.168.1.166', '192.168.1.167', '192.168.1.168', '192.168.1.169', '192.168.1.170', '192.168.1.171', '192.168.1.172', '192.168.1.173', '192.168.1.174', '192.168.1.175', '192.168.1.176', '192.168.1.177', '192.168.1.178', '192.168.1.179', '192.168.1.180', '192.168.1.181', '192.168.1.182', '192.168.1.183', '192.168.1.184', '192.168.1.185', '192.168.1.186', '192.168.1.187', '192.168.1.188', '192.168.1.189', '192.168.1.190', '192.168.1.191', '192.168.1.192', '192.168.1.193', '192.168.1.194', '192.168.1.195', '192.168.1.196', '192.168.1.197', '192.168.1.198', '192.168.1.199', '192.168.1.200', '192.168.1.201', '192.168.1.202', '192.168.1.203', '192.168.1.204', '192.168.1.205', '192.168.1.206', '192.168.1.207', '192.168.1.208', '192.168.1.209', '192.168.1.210', '192.168.1.211', '192.168.1.212', '192.168.1.213', '192.168.1.214', '192.168.1.215', '192.168.1.216', '192.168.1.217', '192.168.1.218', '192.168.1.219', '192.168.1.220', '192.168.1.221', '192.168.1.222', '192.168.1.223', '192.168.1.224', '192.168.1.225', '192.168.1.226', '192.168.1.227', '192.168.1.228', '192.168.1.229', '192.168.1.230', '192.168.1.231', '192.168.1.232', '192.168.1.233', '192.168.1.234', '192.168.1.235', '192.168.1.236', '192.168.1.237', '192.168.1.238', '192.168.1.239', '192.168.1.240', '192.168.1.241', '192.168.1.242', '192.168.1.243', '192.168.1.244']
                GUISetState(@SW_LOCK)
                local $ahItem[UBound($aMachines)]
                _GUICtrlTreeView_BeginUpdate($idMachineList)
                For $x=1 to UBound($aMachines)-1
                    If $aMachines[$x]<>'' then
                        $ahItem[$x]=_GUICtrlTreeView_Add($idMachineList,0,$aMachines[$x],0,1)
                        _GUICtrlTreeView_SetStateImageIndex($idMachineList, $ahItem[$x], 1)
                    Else
                        $ahItem[$x]=_GUICtrlTreeView_Add($idMachineList,0,$aMachines[$x],0,1)
                        _GUICtrlTreeView_SetStateImageIndex($idMachineList, $ahItem[$x], 2)
                    EndIf
                Next
                _GUICtrlTreeView_EndUpdate($idMachineList)
                GUISetState(@SW_UNLOCK)
        EndSwitch
    WEnd
EndFunc

 

Share this post


Link to post
Share on other sites

I wonder if it was a weird AutoIt Internal control ID versus Control Handle issue (return from GUICtrlCreateTreeViewItem versus _GUICTrlTreeView_Add).  Not sure what it would be...especially because _GetSelection should've returned the right handle.  Either way...I still couldn't reproduce on my machine.

Just curirous.  If you remove the $ahItem array does the script still work?  Might be erroneous, unless you plan to reference the items later via this array.
 

;From This
                GUISetState(@SW_LOCK)
                local $ahItem[UBound($aMachines)]
                _GUICtrlTreeView_BeginUpdate($idMachineList)
                For $x=1 to UBound($aMachines)-1
                    If $aMachines[$x]<>'' then
                        $ahItem[$x]=_GUICtrlTreeView_Add($idMachineList,0,$aMachines[$x],0,1)
                        _GUICtrlTreeView_SetStateImageIndex($idMachineList, $ahItem[$x], 1)
                    Else
                        $ahItem[$x]=_GUICtrlTreeView_Add($idMachineList,0,$aMachines[$x],0,1)
                        _GUICtrlTreeView_SetStateImageIndex($idMachineList, $ahItem[$x], 2)
                    EndIf
                Next
                _GUICtrlTreeView_EndUpdate($idMachineList)
                GUISetState(@SW_UNLOCK)
                
;To This
                GUISetState(@SW_LOCK)
                ;local $ahItem[UBound($aMachines)]
                _GUICtrlTreeView_BeginUpdate($idMachineList)
                For $x=1 to UBound($aMachines)-1
                    If $aMachines[$x]<>'' then
                        $hItem=_GUICtrlTreeView_Add($idMachineList,0,$aMachines[$x],0,1)
                        _GUICtrlTreeView_SetStateImageIndex($idMachineList, $hItem, 1)
                    Else
                        $hItem=_GUICtrlTreeView_Add($idMachineList,0,$aMachines[$x],0,1)
                        _GUICtrlTreeView_SetStateImageIndex($idMachineList, $hItem, 2)
                    EndIf
                Next
                _GUICtrlTreeView_EndUpdate($idMachineList)
                GUISetState(@SW_UNLOCK)


 

Share this post


Link to post
Share on other sites

That too appears to work. I'm going to use that instead.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now