TreeView Plus
I was so sure that there just has to be a way to force the plus sign (+) displayed on the TreeView WinForm control - but looks like I was wrong. The TreeView control intelligently decides to show the plus and minus signs depending on whether a node has child nodes or not and whether they are expanded or collapsed. The problem with this design is that it assumes that the control will always know the full tree hierarchy that a user is trying to display. In scenarios where you have a very large list of objects (nodes) to be shown, it might improve performance to not load or retrieve that list till absolutely necessary. So you would want to display a + sign next to a node, irrespective, of whether it has child nodes or not. When the user clicks on the node, the sign can be cleared away if there are no child nodes to be displayed. This is exactly the behavior of the IIS Manager MMC and it seems like it is not possible to do this with the Out-Of-The-Box TreeView control. This is further exacerbated if the data you are retrieving is over a web service (which should become more prevalent as time goes by) – so you would never want to get the full tree details in the very first call that you make.
Am I missing something here? Anyone know of an extended TreeView control which has this option/behavior?
Comments
- Anonymous
April 10, 2004
Hi, Nihit: Couldn't you add a dummy item under each node (which would cause the plus sign to display), then remove it when the user expands the node (and you load the actual subitems)? - Anonymous
April 10, 2004
The comment has been removed - Anonymous
April 10, 2004
Dummy item - only way. - Anonymous
April 10, 2004
The dummy item isn't really 'hacky', especially not if the dummy is grey text saying "Loading..." then at least, for that moment it is visible after the user clicks the plus sign, it shows the user why there was a plus and now there isn't.
At least that is what I do :) - Anonymous
April 10, 2004
Can you think showing the registry content without using dummy treeitems at each level, so that the next level is only expanded upon request ? - Anonymous
April 10, 2004
Agree that dummy items are okay. They were the only way in VB6 as well, so many coders are familiar with it ;) - Anonymous
April 11, 2004
If it helps make you feel any better, I know of several Microsoft products that use the dummy item route in their code. - Anonymous
April 11, 2004
Wow! I didn't know the 'dummy' was this popular...:)
Well - personally the "Loading" idea from Duncan made some sense to me. That way we achieve 2 aims - we provide information to the user, that the list is being loaded dynamically and so they might need to be patient, AND we solve the + sign issue.
Seems like the elegant bill was just met as well. Thanks everyone for all the comments.
And Mike - No - I am not comforted by the fact that there are a lot of MS products which do that. If we reason by that standard, it would be hard to get out of a lot of bad programming practices. IMO.
Stephane - Not sure what your question was, but if you were asking if there was an alternative to the dummy model, well I think there could a property at the control itlsef, which overrides the intelligent behavior and shows the plus/minus signs irrespective of whether the data is loaded or not. Maybe something like "ForcePlusMinusDisplay" in addition to the current "ShowPlusMinus" property. - Anonymous
April 12, 2004
But if you show the + irrespective of whether there are child nodes or not, then aren't you showing inaccurate information? The same applies to the "Loading" idea. What if there is a child node actually named "Loading"?
Ideally, there should be a way of indicating when there may or may not be child nodes (maybe a gray +), and a separate way to indicate during list expansion that the program is loading the children (maybe an animation). - Anonymous
April 12, 2004
My approach has been to do a lazy load of only the items one level down in the hierarchy and load them on the expand event from a parent level item. That way you avoid loading the whole tree into memory, but you always have one deep already there for the plus sign and for a quick responsive tree expansion. - Anonymous
April 13, 2004
Derek - You are right in that, you are still showing inaccurate information if there are no child nodes - but if the 80% case (more in my scenario) has child nodes, then it probably makes sense as compared to not loading any sign at all (which is also useless to the user, since it doesn't tell anything - whether it has child nodes or not - you have to click to see).
Your ideal case is indeed that - Ideal..:)
If I undertake creating an extended TreeView control, I shall keep this in mind.
Brian - Your suggestion is also another good one - though one problem with it might be that, it might not be easy to filter the data in such a way. In my case, thedata is retrieved from various tables, doing joins etc. in different ways, so filtering out on the basis of "level" is not easy as it is not part of the design. But if creating a product from scratch, it would be great to have this option. - Anonymous
July 16, 2004
How can I remove a selected node from treeview without clearing the whole treeview. - Anonymous
July 16, 2004
The comment has been removed - Anonymous
July 19, 2004
The comment has been removed - Anonymous
July 19, 2004
Ooops - Didn't know you were talking about the VB6 TreeView control.
I found this KB which might be useful: http://support.microsoft.com/default.aspx?scid=kb;en-us;172272
since it mentions "It will also allow you to remove a selected Node or branch."
Hope that helps. Sorry - but I haven't used the VB6 TreeView control so can't really help much here. - Anonymous
July 22, 2004
Nihit or Anyone,
Do you know how I can update a recordset in VB6. I Want the new nodes that I added to a treeview to be saved to a table in an access database. This is what I have so far....
On Error GoTo ErrorHandler
'recordset and connection variables
Dim cnn As ADODB.Connection
Dim rstDivisions As ADODB.Recordset
Dim strCnn As String
Dim strDivDesc As String
Dim db As Database
Dim Divisions As New DataEnvironment1
Dim ItemReturn As ListItem
' Open a connection
Set cnn = New ADODB.Connection
Set db = DBEngine.OpenDatabase("c:impactmonday97.mdb")
'Set rs = db.OpenRecordset(strSQL, dbOpenDynaset)
'Set db = OpenDatabase("c:impactmonday97.mdb")
Set rstDivisions = New ADODB.Recordset
' Get data from the ctldivisionsview
With Divisions
Divisions.DivisionTbl
With Divisions.rsDivisionTbl
.AddNew
rstDivisions!tblDivisions = strDivDesc
rstDivisions.Update
End With
End With
rstDivisions.Close
ErrorHandler:
' clean up
If Not rstDivisions Is Nothing Then
If rstDivisions.State = adStateOpen Then rstDivisions.Close
End If
Set rstDivisions = Nothing
If Not cnn Is Nothing Then
If cnn.State = adStateOpen Then cnn.Close
End If
Set cnn = Nothing
If Err <> 0 Then
MsgBox Err.Source & "-->" & Err.Description, , "Error"
End If - Anonymous
July 22, 2004
Dorothy - I would suggest you post this to some VB forum. Very likely that someone will be able to help you there immediately. - Anonymous
August 14, 2007
The comment has been removed