Question

How to add a subcategory/object to a tree (Telerik RadTreeView)

Asked by: John500

Greetings,

The picture below demonstrates the goal of creating a subcategory called 'Notices' on the Telerik RadTreeView control.

My question:  What do I need to do so that I have a new subcategory called 'Notices' for every project under 'Projects' ?

I have tried to follow the code to determine how subcategories are created for each project but I'm having some difficulty.  I need help determining what code exactly populates this tree and then I need help adding an additional object.

Thanks!!

This Question has been solved and asker verified All Experts Exchange premium technology solutions are available to subscription members.

Subscribe now for full access to Experts Exchange and get

Instant Access to this Solution

  • Plus...
  • 30 Day FREE access, no risk, no obligation
  • Collaborate with the world's top tech experts
  • Unlimited access to our exclusive solution database
  • Never be left without tech help again

Subscribe Now

Asked On
2009-06-30 at 07:54:17ID24533447
Tags

ASP .Net

,

Telerik controls

Topic

Web Graphics Software

Participating Experts
2
Points
500
Comments
24

Trusted by hundreds of thousands everyday for fast, accurate and reliable tech support.

  • "The time we save is the biggest benefit of Experts Exchange to Warner Bros. What could take multiple guys 2 hours or more each to find is accessed in around 15 minutes on Experts Exchange." Mike Kapnisakis, Warner Bros.
  • "Our team likes having a resource that is more secure than just using Google and most experts using this service really know their stuff. It's nice to look here first versus using Google." Dayna Sellner, Lockheed Martin
  • "Anytime that I've been stumped with a problem, 9 out of 10 times Experts Exchange has either the accepted solution or an open discussion of the potential solution to the problem." Kenny Red, eBay Inc.

See what Experts Exchange can do for you.

Got a question?

We've got the answer.

Experts Exchange has been collecting answers to technology questions since 1996…3 million and counting! If you have a question, chances are we already have your answer.

Screenshot of Experts Exchange Knowledgebase

Need individual assistance?

Our experts are ready to help.

If you can't find the exact answer you're looking for, ask our exclusive community of 50,000 experts. You’ll get a personalized answer from a trusted professional.

Screenshot of Experts Exchange Knowledgebase

Want to learn from the best?

Read articles from industry experts.

Thousands of free tech tips, tricks, how-to’s and tutorials are available in our peer reviewed articles section. See for yourself how smart our experts are, no login required.

Screenshot of an Article

Working on a long term project?

Store your work and research.

Save solutions to your questions, answers you’ve discovered through searching plus helpful articles in your personal knowledgebase for easy future access.

Screenshot of Experts Exchange Knowledgebase

Access the answers to your technology questions today.

Subscribe Now

30-day free trial. Register in 60 seconds.

What Makes Experts Exchange Unique?

Members of the expert community talk about why the experience at Experts Exchange is different than what you will find anywhere else.

Trusted by the world's most respected brands.

image of each brand's logo

Faithfully serving IT professionals since 1996.

Experts Exchange Logo

Try it out and discover for yourself.

Subscribe Now

30-day free trial. Register in 60 seconds.

Related Solutions

  1. SUbcategories
    AT present I use Dreamweaver to design my web pages and I use buttons with swapover to get to navigate to pages. How do I set up subcategory buttons that appear when mouse over on a button takes place? For instance: Plenary Speakers is the main button. When that is clicked ...
  2. Contact Subcategories
    Hi is it possible in outlook to create a subcategory. So when you select a category like investor you can select a subcategory for the category investor.
  3. telerik TAB
    as I can put a control (.ascx) in 1 tab I am working with the control tab of the company telerik
  4. Telerik Reporting Question
    Hi. I am currently experimenting (newbie) with Telerik reports in VS 2008. I have programmatically bound a SQLAdapter object to a datasource of a Telerik report. The next question becomes how do I display the data on the report now. Do I need to somehow programmatically tap i...
  5. Telerik
    1.In what areas do you find Infragistics/DevExpress to be stronger than Telerik, and what areas are Telerik stronger than Infragistics/DevExpress?

Free Tech Articles

  1. WARNING: 5 Reasons why you should NEVER fix a computer for free.
    It is in our nature to love the puzzle. We are obsessed. The lot of us. We love puzzles. We love the challenge. We thrive on finding the answer. We hate disarray. It bothers us deep in our soul. W...
  2. SCCM OSD Basic troubleshooting
    SCCM 2007 OSD is a fantastic way to deploy operating systems, however, like most things SCCM issues can sometimes be difficult to resolve due to the sheer volume of logs to sift through and the dispe...
  3. Migrate Small Business Server 2003 to Exchange 2010 and Windows 2008 R2
    This guide is intended to provide step by step instructions on how to migrate from Small Business Server 2003 to Windows 2008 R2 with Exchange 2010. For this migration to work you will need the fo...
  4. Create a Win7 Gadget
    This article shows you how to create a simple "Gadget" -- a sort of mini-application supported by Windows 7 and Vista. Gadgets can be dropped anywhere on the desktop to provide instant information, ...
  5. Outlook continually prompting for username and password
    There have been a lot of questions recently regarding Outlook prompting for a username and password whilst using Exchange 2007. There are a few reasons why this would happen and I will try to cover t...
  6. Backup Exchange 2010 Information Store using Windows Backup
    There seems to be quite a lot of confusion around the ability to backup Exchange 2010 using the built in Windows Backup feature. This stems from the omission of this feature prior to Exchange 2007 s...

Cloud Class Webinars

  1. Avoiding Bugs in Microsoft Access
    Alison Balter takes and in-depth look at avoiding bugs in Access. In this webinar you will learn about using the immediate window to debug your applications, invoking the debugger, using breakpoints to troubleshoot, stepping through code, setting the next statement to execute, ...
  2. Top 10 Best New Features in Visio 2010
    Scott Helmers gives live demonstrations of the top 10 new features in Visio 2010. This webinar will teach you how to create compelling diagrams by adding shapes to the page with a single click, linking the shapes in a diagram to data in Excel (or SQL Server, or SharePoint), ...
  3. IT Consultant Business Secrets Revealed
    Michael Munger, Experts Exchange tech pro and IT consultant, pulls back the curtain on his very successful businesses and answers question on every IT consultant and business owner should know about. He shares secrets on what he did to solve the 5 most common problems in IT, ...
  4. Disaster Recovery and Business Continuity
    Quest CTO, Mike Billon, gives an overview of the steps involved in building a dunamic disaster recovery plan. Through case studies and an examination of software/hardware tooles for monitoring and testing, you'll gain a better understandin of where you are, where you want ...
  5. Organize Your Visio Diagrams with Containers and Lists
    Scott Helmers uses cross functional flowcharts, wireframe diagrams, data graphic legends and seating charts to teach you: how to ustilize all three new structured diagram components in Visio 2010, the best practices for organizeing shapes in previous version of Visio, how to organize ...
  6. How to Us Objects, Properties, Events and Methods in Microsoft Access
    Alison Dalter gives an in-depbth look at objects, properties, events and methods in Microsoft Access. In this webinar you will learn about using the object browser, referring to objects, working with properties and methods, working with object variables, understanding the ...

Join the Community

Give a Little. Get a Lot.

Join the community of experts here and help other tech pros by answering question in your area of expertise. You can earn FREE access to all Experts Exchange's premium features and resources.

Join the Community

Answers

 

by: crittle1Posted on 2009-06-30 at 09:16:52ID: 24746825

I looked, I'm not able to help :(  I'm so sorry

 

by: numberkruncherPosted on 2009-06-30 at 09:27:59ID: 24746939

How is the tree being generated?

Without any source it is very difficult to assist.

 

by: John500Posted on 2009-06-30 at 10:42:56ID: 24747608

>> How is the tree being generated

I was thinking I needed to place an object of some kind on the form first but I guess the objects are already placed and all I need to do is pull from the database to add additional nodes, yes/no?

How about the code below?

Load Tree Nodes
----------------
 
Protected Function KNavigator_LoadNode( _
         ByRef oDataSource As DataSet, _
         ByRef NodeParent As Telerik.Web.UI.RadTreeNode, _
         ByRef Parent_Id As Integer _
         ) As Boolean
        Try
            'Dim ie As IEnumerator = oDataSource.GetEnumerator
            'Dim e As Entity
            'ie.Reset()
            Dim t As DataTable
            t = oDataSource.Tables("Nodes")
            Dim strExpr As String
            Dim strSort As String
            strExpr = " entity_pid1 = " + Parent_Id.ToString
            ' Sort descending by column named CompanyName.
            strSort = "lexicontypeordinal,entityname "
            Dim foundRows() As DataRow
 
            foundRows = t.Select(strExpr, strSort)
 
            For Each dr As DataRow In foundRows
                Dim xNode As New Telerik.Web.UI.RadTreeNode
                'format node for given entity
                With xNode
                    .Attributes.Add("Entity_ID", dr.Item("Entity_ID").ToString)
                    .Attributes.Add("Tag", "eClass")
                    .Value = dr.Item("Entity_ID").ToString
                    .Text = dr.Item("EntityName").ToString
                    .ImageUrl = Navigator_GetImageURL(dr.Item("EntityType_Code").ToString)
                End With
                NodeParent.Nodes.Add(xNode)
                Dim ds As New DataSet
                Dim rc As nsRALPH_ENUM.DAL_ReturnCode = OK
                Dim htable As New Hashtable
                htable = CType(Session("ExpandedNode"), Hashtable)
                rc = dvl.View_SubFolders(CInt(dr.Item("Entity_ID")), ds)
                If htable IsNot Nothing Then
                    If ds.Tables(0).Rows.Count > 0 AndAlso Not htable.Contains(dr.Item("Entity_ID").ToString) Then _
                        xNode.ExpandMode = TreeNodeExpandMode.ServerSideCallBack
                    If htable.Contains(dr.Item("Entity_ID").ToString) Then
                        xNode.Expanded = True
                        xNode.ExpandMode = TreeNodeExpandMode.ServerSide
                    Else
                        xNode.Expanded = False
                    End If
 
                Else
                    If ds.Tables(0).Rows.Count > 0 Then
                        xNode.ExpandMode = TreeNodeExpandMode.ServerSideCallBack
                    End If
                End If
                _CurrentEntity = CType(Session("CurrentEntity"), Entity)
                If _CurrentEntity IsNot Nothing Then
                    If dr.Item("Entity_ID").ToString = _CurrentEntity.Entity_ID.ToString Then
                        xNode.Selected = True
                    End If
                End If
                KNavigator_LoadNode(oDataSource, xNode, CInt(dr.Item("Entity_ID").ToString))
            Next
 
            Return True
        Catch ex As Exception
            RaiseMessage(False, "Navigator_LoadNode(eZ) Exception Error: " & ex.Message)
            Return False
        End Try
    End Function
 
                                              
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:

Select allOpen in new window

 

by: numberkruncherPosted on 2009-06-30 at 12:25:38ID: 24748630

Try something like the following, there are several changes that you need to make, I have indicated those using comments.

Load Tree Nodes
----------------
 
' Data structure to store both entity ID and Type!
Public Structure EntityNodeData
	Public entityID As String
	Public entityType As String
 
	Public Sub New(ByVal id As String, ByVal type As String)
		entityID = id
		entityType = type
	End Sub
End Structure
 
Protected Function KNavigator_LoadNode( _
         ByRef oDataSource As DataSet, _
         ByRef NodeParent As Telerik.Web.UI.RadTreeNode, _
         ByRef Parent_Id As Integer _
         ) As Boolean
        Try
            'Dim ie As IEnumerator = oDataSource.GetEnumerator
            'Dim e As Entity
            'ie.Reset()
            Dim t As DataTable
            t = oDataSource.Tables("Nodes")
            Dim strExpr As String
            Dim strSort As String
            strExpr = " entity_pid1 = " + Parent_Id.ToString
            ' Sort descending by column named CompanyName.
            strSort = "lexicontypeordinal,entityname "
            Dim foundRows() As DataRow
 
            foundRows = t.Select(strExpr, strSort)
 
            For Each dr As DataRow In foundRows
                Dim xNode As New Telerik.Web.UI.RadTreeNode
                'format node for given entity
                With xNode
                    .Attributes.Add("Entity_ID", dr.Item("Entity_ID").ToString)
                    .Attributes.Add("Tag", "eClass")
 
                    ' Use data structure so that both ID and Type can be accessed at a later stage.
                    .Value = New EntityNodeData(dr.Item("Entity_ID").ToString, dr.Item("EntityType_Code").ToString)
                    
                    .Text = dr.Item("EntityName").ToString
                    .ImageUrl = Navigator_GetImageURL(dr.Item("EntityType_Code").ToString)
                End With
                NodeParent.Nodes.Add(xNode)
                Dim ds As New DataSet
                Dim rc As nsRALPH_ENUM.DAL_ReturnCode = OK
                Dim htable As New Hashtable
                htable = CType(Session("ExpandedNode"), Hashtable)
                rc = dvl.View_SubFolders(CInt(dr.Item("Entity_ID")), ds)
                If htable IsNot Nothing Then
                    If ds.Tables(0).Rows.Count > 0 AndAlso Not htable.Contains(dr.Item("Entity_ID").ToString) Then _
                        xNode.ExpandMode = TreeNodeExpandMode.ServerSideCallBack
                    If htable.Contains(dr.Item("Entity_ID").ToString) Then
                        xNode.Expanded = True
                        xNode.ExpandMode = TreeNodeExpandMode.ServerSide
                    Else
                        xNode.Expanded = False
                    End If
 
                Else
                    If ds.Tables(0).Rows.Count > 0 Then
                        xNode.ExpandMode = TreeNodeExpandMode.ServerSideCallBack
                    End If
                End If
                _CurrentEntity = CType(Session("CurrentEntity"), Entity)
                If _CurrentEntity IsNot Nothing Then
                    If dr.Item("Entity_ID").ToString = _CurrentEntity.Entity_ID.ToString Then
                        xNode.Selected = True
                    End If
                End If
                KNavigator_LoadNode(oDataSource, xNode, CInt(dr.Item("Entity_ID").ToString))
 
	'******
	' TODO: 1) You will need to change "Project" to the entity type name!!
	'		2) Adjust "YOUR IMAGE PATH!" to point to an icon of some sort.
	'******
				' If parent node is a project, add notices node at end.
				Dim entityData As EntityNodeData = NodeParent.Value
                If Not entityData Is Nothing And entityData.entityType = "Project" Then
                	Dim noticesNode As New Telerik.Web.UI.RadTreeNode
                	With noticesNode
	                    .Attributes.Add("Entity_ID", dr.Item("Entity_ID").ToString)
	                    .Attributes.Add("Tag", "eClass")
 
	                    .Value = New EntityNodeData("", "ProjectNoticesNode")
	                    
	                    .Text = dr.Item("EntityName").ToString
	                    .ImageUrl = "YOUR IMAGE PATH!"
                	End With
                End If
            Next
 
            Return True
        Catch ex As Exception
            RaiseMessage(False, "Navigator_LoadNode(eZ) Exception Error: " & ex.Message)
            Return False
        End Try
    End Function

                                              
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:

Select allOpen in new window

 

by: John500Posted on 2009-06-30 at 13:52:55ID: 24749470

Ok, thanks for that last post......

The page which contains this code is a master page and starts like this:

Partial Public Class BF_MasterPage
    Inherits System.Web.UI.MasterPage
    ....
    Public Structure EntityNodeData
    ...

I stuck the structure code just below this.  Sound right?

Also, I have errors where ever the assignment to the value occurs.  For instance:

 With xNode
                    .Attributes.Add("Entity_ID", dr.Item("Entity_ID").ToString)
                    .Attributes.Add("Tag", "eClass")

                    ' Use data structure so that both ID and Type can be accessed at a later stage.
                    .Value = New EntityNodeData(dr.Item("Entity_ID").ToString, dr.Item("EntityType_Code").ToString) ****** ERROR *****

                    .Text = dr.Item("EntityName").ToString
                    .ImageUrl = Navigator_GetImageURL(dr.Item("EntityType_Code").ToString)
 End With

The error:

Value of type 'BF_MasterPage.EntityNodeData' cannot be converted to 'String'.      

Your thoughts?

 

by: numberkruncherPosted on 2009-06-30 at 14:13:28ID: 24749674

> I stuck the structure code just below this.  Sound right?

Yep, that should be fine! Place the replacement class in the same place.


> Also, I have errors where ever the assignment to the value occurs.  For instance:

Ah, I was afraid that might happen, I was hoping that "Value" was of type "Object" or "Variant". Okay, this shouldn't be a problem.

In that case, you will need to subclass the "RadTreeNode" class so that it does support what you need. This is probably a good idea anyhow, you will be able to store any information you want to with each node:

Replace the struct with the following class:
============================================
    Public Class EntityTreeNode
        Inherits RadTreeNode
 
        Public Sub New(ByVal id As String, ByVal type As String)
            EntityID = id
            EntityType = type
        End Sub
 
        Public Property EntityType() As String
            Get
                Return Me._entityType
            End Get
            Set(ByVal value As String)
                Me._entityType = value
            End Set
        End Property
 
        Public Property EntityID() As String
            Get
                Return Me._entityID
            End Get
            Set(ByVal value As String)
                Me._entityID = value
            End Set
        End Property
 
        Private _entityType As String
        Private _entityID As String
    End Class
 
 
Update your source:
===================
Protected Function KNavigator_LoadNode( _
         ByRef oDataSource As DataSet, _
         ByRef NodeParent As Telerik.Web.UI.RadTreeNode, _
         ByRef Parent_Id As Integer _
         ) As Boolean
        Try
            'Dim ie As IEnumerator = oDataSource.GetEnumerator
            'Dim e As Entity
            'ie.Reset()
            Dim t As DataTable
            t = oDataSource.Tables("Nodes")
            Dim strExpr As String
            Dim strSort As String
            strExpr = " entity_pid1 = " + Parent_Id.ToString
            ' Sort descending by column named CompanyName.
            strSort = "lexicontypeordinal,entityname "
            Dim foundRows() As DataRow
 
            foundRows = t.Select(strExpr, strSort)
 
            For Each dr As DataRow In foundRows
                Dim xNode As New EntityTreeNode
                'format node for given entity
                With xNode
                    .Attributes.Add("Entity_ID", dr.Item("Entity_ID").ToString)
                    .Attributes.Add("Tag", "eClass")
 
                    ' Use data structure of our custom node!
                    .EntityID = dr.Item("Entity_ID").ToString
                    .EntityType = dr.Item("EntityType_Code").ToString
                    
                    .Text = dr.Item("EntityName").ToString
                    .ImageUrl = Navigator_GetImageURL(dr.Item("EntityType_Code").ToString)
                End With
                NodeParent.Nodes.Add(xNode)
                Dim ds As New DataSet
                Dim rc As nsRALPH_ENUM.DAL_ReturnCode = OK
                Dim htable As New Hashtable
                htable = CType(Session("ExpandedNode"), Hashtable)
                rc = dvl.View_SubFolders(CInt(dr.Item("Entity_ID")), ds)
                If htable IsNot Nothing Then
                    If ds.Tables(0).Rows.Count > 0 AndAlso Not htable.Contains(dr.Item("Entity_ID").ToString) Then _
                        xNode.ExpandMode = TreeNodeExpandMode.ServerSideCallBack
                    If htable.Contains(dr.Item("Entity_ID").ToString) Then
                        xNode.Expanded = True
                        xNode.ExpandMode = TreeNodeExpandMode.ServerSide
                    Else
                        xNode.Expanded = False
                    End If
 
                Else
                    If ds.Tables(0).Rows.Count > 0 Then
                        xNode.ExpandMode = TreeNodeExpandMode.ServerSideCallBack
                    End If
                End If
                _CurrentEntity = CType(Session("CurrentEntity"), Entity)
                If _CurrentEntity IsNot Nothing Then
                    If dr.Item("Entity_ID").ToString = _CurrentEntity.Entity_ID.ToString Then
                        xNode.Selected = True
                    End If
                End If
                KNavigator_LoadNode(oDataSource, xNode, CInt(dr.Item("Entity_ID").ToString))
 
        '******
        ' TODO: 1) You will need to change "**Project**" to the entity type name!!
        '       2) Adjust "***YOUR IMAGE PATH!***" to point to an icon of some sort.
        '******
				' If parent node is a project, add notices node at end.
				Dim entityNode As EntityTreeNode = NodeParent
                If Not entityNode Is Nothing And entityNode.EntityType = "**Project**" Then
                        Dim noticesNode As New Telerik.Web.UI.RadTreeNode
                        With noticesNode
                            .Value = "ProjectNoticesNode"
                            .Text = "Notices"
                            .ImageUrl = "***YOUR IMAGE PATH!***"
                        End With
                End If
            Next
 
            Return True
        Catch ex As Exception
            RaiseMessage(False, "Navigator_LoadNode(eZ) Exception Error: " & ex.Message)
            Return False
        End Try
    End Function

                                              
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:

Select allOpen in new window

 

by: numberkruncherPosted on 2009-06-30 at 14:14:57ID: 24749688

Just to add, please note that some subtle changes have been made, like on line 57, for example:

Dim xNode As New EntityTreeNode

 

by: John500Posted on 2009-07-01 at 05:45:11ID: 24753700

>>  some subtle changes have been made, like on line 57, for example:

Ok, on that particular line I'm getting the following errors:

Argument not specified for parameter 'id' of 'Public Sub New(id As String, type As String)'      
Argument not specified for parameter 'type' of 'Public Sub New(id As String, type As String)'

After that I have the following two errors for the associated lines:
----------------------------------------------------------------------------------------------------------------------------------------

ERROR ON *** xNode  ***

              KNavigator_LoadNode(oDataSource, xNode, CInt(dr.Item("Entity_ID").ToString))

Option Strict On disallows narrowing from type 'Telerik.Web.UI.RadTreeNode' to type 'BF_MasterPage.EntityTreeNode' in copying the value of 'ByRef' parameter 'NodeParent' back to the matching argument.      
----------------------------------------------------------------------------------------------------------------------------------------

ERROR ON *** NodeParent ***

              Dim entityNode As EntityTreeNode = NodeParent

Option Strict On disallows implicit conversions from 'Telerik.Web.UI.RadTreeNode' to 'BF_MasterPage.EntityTreeNode'.      
----------------------------------------------------------------------------------------------------------------------------------------

 

by: numberkruncherPosted on 2009-07-01 at 05:55:25ID: 24753803

> Ok, on that particular line I'm getting the following errors:

Please verify that you have written the following:
Public Sub New(ByVal id As String, ByVal type As String)

NOT the following:
Public Sub New(id As String, type As String)

> After that I have the following two errors for the associated lines:

Can you please post your full page code so that I can investigate?

 

by: John500Posted on 2009-07-01 at 06:20:31ID: 24754012

>> Can you please post your full page code so that I can investigate?

I would love to but there are 1,692 lines on this particular page if that's indeed what you are talking about.  However, I'm a little leary of the whole trade secret thing by dumping so much.

Don't you agree that although 'Inherits RadTreeNode' within the class would seem to address the original issue of type:

Dim xNode As New Telerik.Web.UI.RadTreeNode

... the ,Public Sub New()'  just doesn't agree by virtue of these two parameters

(ByVal id As String, ByVal type As String)

What am I missing?

Here's the code as it is in my project:


    Public Class EntityTreeNode
        Inherits RadTreeNode
 
        Public Sub New(ByVal id As String, ByVal type As String)
            EntityID = id
            EntityType = type
        End Sub
 
        Public Property EntityType() As String
            Get
                Return Me._entityType
            End Get
            Set(ByVal value As String)
                Me._entityType = value
            End Set
        End Property
 
        Public Property EntityID() As String
            Get
                Return Me._entityID
            End Get
            Set(ByVal value As String)
                Me._entityID = value
            End Set
        End Property
 
        Private _entityType As String
        Private _entityID As String
    End Class
 
 
Protected Function KNavigator_LoadNode( _
             ByRef oDataSource As DataSet, _
             ByRef NodeParent As Telerik.Web.UI.RadTreeNode, _
             ByRef Parent_Id As Integer _
             ) As Boolean
        Try
            'Dim ie As IEnumerator = oDataSource.GetEnumerator
            'Dim e As Entity
            'ie.Reset()
            Dim t As DataTable
            t = oDataSource.Tables("Nodes")
            Dim strExpr As String
            Dim strSort As String
            strExpr = " entity_pid1 = " + Parent_Id.ToString
            ' Sort descending by column named CompanyName.
            strSort = "lexicontypeordinal,entityname "
            Dim foundRows() As DataRow
 
            foundRows = t.Select(strExpr, strSort)
 
            For Each dr As DataRow In foundRows
                Dim xNode As New EntityTreeNode          ' ******** ERROR HERE ON xNode ********
                'format node for given entity
                With xNode
                    .Attributes.Add("Entity_ID", dr.Item("Entity_ID").ToString)
                    .Attributes.Add("Tag", "eClass")
 
                    ' Use data structure of our custom node!
                    .EntityID = dr.Item("Entity_ID").ToString
                    .EntityType = dr.Item("EntityType_Code").ToString
 
                    .Text = dr.Item("EntityName").ToString
                    .ImageUrl = Navigator_GetImageURL(dr.Item("EntityType_Code").ToString)
                End With
                NodeParent.Nodes.Add(xNode)
                Dim ds As New DataSet
                Dim rc As nsRALPH_ENUM.DAL_ReturnCode = OK
                Dim htable As New Hashtable
                htable = CType(Session("ExpandedNode"), Hashtable)
                rc = dvl.View_SubFolders(CInt(dr.Item("Entity_ID")), ds)
                If htable IsNot Nothing Then
                    If ds.Tables(0).Rows.Count > 0 AndAlso Not htable.Contains(dr.Item("Entity_ID").ToString) Then _
                        xNode.ExpandMode = TreeNodeExpandMode.ServerSideCallBack
                    If htable.Contains(dr.Item("Entity_ID").ToString) Then
                        xNode.Expanded = True
                        xNode.ExpandMode = TreeNodeExpandMode.ServerSide
                    Else
                        xNode.Expanded = False
                    End If
 
                Else
                    If ds.Tables(0).Rows.Count > 0 Then
                        xNode.ExpandMode = TreeNodeExpandMode.ServerSideCallBack
                    End If
                End If
                _CurrentEntity = CType(Session("CurrentEntity"), Entity)
                If _CurrentEntity IsNot Nothing Then
                    If dr.Item("Entity_ID").ToString = _CurrentEntity.Entity_ID.ToString Then
                        xNode.Selected = True
                    End If
                End If
                KNavigator_LoadNode(oDataSource, xNode, CInt(dr.Item("Entity_ID").ToString))  ' ******** ERROR HERE ON xNode ********
 
                '******
                ' TODO: 1) You will need to change "**Project**" to the entity type name!!
                '       2) Adjust "***YOUR IMAGE PATH!***" to point to an icon of some sort.
                '******
                ' If parent node is a project, add notices node at end.
                Dim entityNode As EntityTreeNode = NodeParent                                  ' ******** ERROR HERE ON NodeParent ********
                If Not entityNode Is Nothing And entityNode.EntityType = "Notice Templates" Then
                    Dim noticesNode As New Telerik.Web.UI.RadTreeNode
                    With noticesNode
                        .Value = "ProjectNoticesNode"
                        .Text = "Notices"
                        .ImageUrl = "~/images/main heading icon_Notices.gif"
                    End With
                End If
            Next
 
            Return True
        Catch ex As Exception
            RaiseMessage(False, "Navigator_LoadNode(eZ) Exception Error: " & ex.Message)
            Return False
        End Try
    End Function

                                              
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:

Select allOpen in new window

 

by: John500Posted on 2009-07-01 at 06:34:40ID: 24754137

Maybe there is something else I can provide that doesn't include all 1,692 lines of code, yes/no?

For example, here is the code for the main load of the page or tree:

Protected Sub kNavigatorMain_Load(ByVal LocationID As Integer)
        Try
            Dim amok As Boolean = True
            Dim returnmessage As String = ""
            Dim rc As nsRALPH_ENUM.DAL_ReturnCode
            Dim setCurrentEntity As Boolean = False
 
            'Get extended Entity object for the given LocationID
            Dim eClass As New Entity
            Dim nodes_dset As New DataSet
            rc = dvl.View_TreeNodeList(_Token.LoginLocation_ID, nodes_dset)
 
            Dim def As String = Now.TimeOfDay.ToString
            'Instance My Nodes
            Dim MyNode As New Telerik.Web.UI.RadTreeNode
            MyNode.Text = "My Home Page"
            MyNode.Value = "MYHOME"
            MyNode.ImageUrl = "~/images/Nav_MyHomePage.gif"
            MyNode.Attributes.Add("Tag", _Token.LoginLocation_ID.ToString)
            Dim pNode As New Telerik.Web.UI.RadTreeNode
            With pNode
                .Text = "My Projects"
                .Value = "MYPROJECT"
                .ImageUrl = "~/images/Nav_MyProjects.gif"
                .Attributes.Add("Tag", "MYPROJECT")
            End With
            MyNode.Nodes.Add(pNode.Clone)
            Dim cNode As New Telerik.Web.UI.RadTreeNode
            With cNode
                .Text = "My Contacts"
                .Value = "MYCONTACT"
                .ImageUrl = "~/images/Nav_MyContacts.gif"
                .Attributes.Add("Tag", "MYCONTACT")
            End With
            MyNode.Nodes.Add(cNode.Clone)
            Dim aNode As New Telerik.Web.UI.RadTreeNode
            With aNode
                .Text = "Administration"
                .Value = "MYADMIN"
                .ImageUrl = "~/images/Nav_MyContacts.gif"
                .Attributes.Add("Tag", "MYADMIN")
            End With
            MyNode.Nodes.Add(aNode.Clone)
            NavigatorMain.Nodes.Add(MyNode.Clone)
            pNode = Nothing
            cNode = Nothing
            aNode = Nothing
            MyNode = Nothing
 
            'instance Root Node
            Dim Node As New Telerik.Web.UI.RadTreeNode
            Dim strExpr As String
            Dim strSort As String
            strExpr = " entity_id = " + _Token.LoginLocation_ID.ToString
            strSort = "lexicontypeordinal,entityname "
 
            Dim foundRows() As DataRow
            Dim t As DataTable
            t = nodes_dset.Tables("Nodes")
            foundRows = t.Select(strExpr, strSort)
            Dim dr As DataRow = foundRows(0)
 
            With Node
                .Attributes.Add("Entity_ID", dr.Item("Entity_ID").ToString)
                .Attributes.Add("Tag", "eClass")
                .Value = dr.Item("Entity_ID").ToString
                .Text = dr.Item("EntityName").ToString
                .ImageUrl = Navigator_GetImageURL(dr.Item("EntityType_Code").ToString)
            End With
 
		********************  CALL TO KNavigator_LoadNode() HERE ********************
 
            If amok Then _	
                amok = KNavigator_LoadNode(nodes_dset, Node, CInt(_Token.LoginLocation_ID.ToString))
 
            If amok AndAlso Node IsNot Nothing Then
                'add eClass node
                NavigatorMain.Nodes.Add(Node)
 
                'set selected node
                NavigatorMain.Nodes(0).Expanded = True
                NavigatorMain.Nodes(1).Expanded = True
 
                Select Case Me.Parent.ToString
                    Case "BF-Home"
                        Me.NavigatorMain.Nodes(1).Selected = True
                        setCurrentEntity = True
                    Case "BF-MyProjects"
                        Me.NavigatorMain.Nodes(0).Nodes(0).Selected = True
                    Case "BF-MyContacts"
                        Me.NavigatorMain.Nodes(0).Nodes(1).Selected = True
                    Case "BF-Admin"
                        Me.NavigatorMain.Nodes(0).Nodes(2).Selected = True
                End Select
 
            End If
 
            'set current entity
            If amok AndAlso setCurrentEntity Then
                If _CurrentEntity Is Nothing Then _CurrentEntity = New Entity
                amok = bll.eList_ByOption(CType(Me.NavigatorMain.SelectedNode.Value, Integer), _CurrentEntity, returnmessage)
                Session("CurrentEntity") = _CurrentEntity
            End If
 
            'clean-up
            Node = Nothing
            'Dim selectednode As New RadTreeNode
            'selectednode = CType(Session("SelectedNode"), RadTreeNode)
            'selectednode.Selected = True
        Catch ex As Exception
            RaiseMessage(False, "BuildflowMaster.NavigatorMain_Load Exception Error: " & ex.Message)
        End Try
    End Sub
                                              
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:

Select allOpen in new window

 

by: numberkruncherPosted on 2009-07-01 at 07:28:44ID: 24754689

>  would love to but there are 1,692 lines on this particular page if that's indeed what you are
> talking about.  However, I'm a little leary of the whole trade secret thing by dumping so much.

Sure, 1,692 would be excessive, and you should never release anything that you want to keep secret.

> What am I missing?

Actually it is something that I missed, simply change the class that you added to the following. Apologies for this error on my part.

    Public Class EntityTreeNode
        Inherits RadTreeNode
 
        Public Sub New()
 
        End Sub
 
        Public Sub New(ByVal id As String, ByVal type As String)
            EntityID = id
            EntityType = type
        End Sub
 
        Public Property EntityType() As String
            Get
                Return Me._entityType
            End Get
            Set(ByVal value As String)
                Me._entityType = value
            End Set
        End Property
 
        Public Property EntityID() As String
            Get
                Return Me._entityID
            End Get
            Set(ByVal value As String)
                Me._entityID = value
            End Set
        End Property
 
        Private _entityType As String
        Private _entityID As String
    End Class

                                              
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:

Select allOpen in new window

 

by: John500Posted on 2009-07-01 at 07:56:07ID: 24754992

Ok, the added Sub New() got rid of the first error but still have these two:

----------------------------------------------------------------------------------------------------------------------------------------

ERROR ON *** xNode  ***

              KNavigator_LoadNode(oDataSource, xNode, CInt(dr.Item("Entity_ID").ToString))

Option Strict On disallows narrowing from type 'Telerik.Web.UI.RadTreeNode' to type 'BF_MasterPage.EntityTreeNode' in copying the value of 'ByRef' parameter 'NodeParent' back to the matching argument.      
----------------------------------------------------------------------------------------------------------------------------------------

ERROR ON *** NodeParent ***

              Dim entityNode As EntityTreeNode = NodeParent

Option Strict On disallows implicit conversions from 'Telerik.Web.UI.RadTreeNode' to 'BF_MasterPage.EntityTreeNode'.      
----------------------------------------------------------------------------------------------------------------------------------------

Can you tell me why the compiler sees this as a conversion rather than a modification of attributes?  Isn't that what you are trying to do?

 

by: numberkruncherPosted on 2009-07-01 at 08:03:07ID: 24755073

Have a go at the following:

Dim entityNode As EntityTreeNode = TryCast(NodeParent, EntityTreeNode)

This might address both issues,

 

by: John500Posted on 2009-07-01 at 08:17:32ID: 24755230

This took care of the second error.  Only this one now:

----------------------------------------------------------------------------------------------------------------------------------------

ERROR ON *** xNode  ***

              KNavigator_LoadNode(oDataSource, xNode, CInt(dr.Item("Entity_ID").ToString))

Option Strict On disallows narrowing from type 'Telerik.Web.UI.RadTreeNode' to type 'BF_MasterPage.EntityTreeNode' in copying the value of 'ByRef' parameter 'NodeParent' back to the matching argument.      
----------------------------------------------------------------------------------------------------------------------------------------

I guess the recursive aspect of this entire method doesn't like going back and forth between 'EntityTreeNode' and 'Telerik.Web.UI.RadTreeNode'  - right?

 

by: John500Posted on 2009-07-01 at 08:19:30ID: 24755255

Maybe this is a case of a lazy control - just doesn't want to do the work - yes/no?

Kidding

 

by: numberkruncherPosted on 2009-07-01 at 08:25:28ID: 24755328

> Maybe this is a case of a lazy control - just doesn't want to do the work - yes/no?
rofl - funny!

> I guess the recursive aspect of this entire method doesn't like going back and forth between 'EntityTreeNode' and 'Telerik.Web.UI.RadTreeNode'  - right?

Try using the following line instead, perhaps a TryCast will work here too.

              KNavigator_LoadNode(oDataSource, TryCast(xNode, RadTreeNode), CInt(dr.Item("Entity_ID").ToString))

 

by: John500Posted on 2009-07-01 at 09:11:25ID: 24755820

Getting closer all the time.

I ran the code and it worked from the standpoint there were no runtime errors.  However, it only shows the icons in the far left picture below.  Thus, no subfolders are being added.

The picture on the far right shows what it normally looks like.  The fully expanded view is at the top of this question.

Can you tell me if you agree with what I see going on here:

Steps

1)  Create table for incoming dataset
2)  Sort the table and store it in foundRows() table
3)  For each row in the sorted table create a node
4)  For each node set the attributes
5)  Add the new node to the parent node
6)  Get new dataset based upon whether the database shows
    subfolders/objects for the current Entity_ID
7)  If so, add the result of the dataset to XNode
8)  If the current Entity_ID is a of type 'Notice Templates'
    add an icon to it

Did I miss anything?  I'm trying to see why the subfolders weren't added but I don't see it.  I'm also wondering why the following subnodes/folders aren't added during a normal load but this time they were:

My Projects
My Contacts
Administration

I take it there is a filter in the event there is no data to load?

 

by: John500Posted on 2009-07-01 at 11:20:12ID: 24756825

Would you agree the following line needs to be included which was in the original code:

 .Value = dr.Item("Entity_ID").ToString


Current/Revised Code:
--------------------------------
With xNode
                    .Attributes.Add("Entity_ID", dr.Item("Entity_ID").ToString)
                    .Attributes.Add("Tag", "eClass")
 
                    ' Use data structure of our custom node!
                    .EntityID = dr.Item("Entity_ID").ToString
                    .EntityType = dr.Item("EntityType_Code").ToString
 
                    .Text = dr.Item("EntityName").ToString
                    .ImageUrl = Navigator_GetImageURL(dr.Item("EntityType_Code").ToString)
End With
 
 
Original Code
--------------------------
With xNode
                    .Attributes.Add("Entity_ID", dr.Item("Entity_ID").ToString)
                    .Attributes.Add("Tag", "eClass")
                    .Value = dr.Item("Entity_ID").ToString
                    .Text = dr.Item("EntityName").ToString
                    .ImageUrl = Navigator_GetImageURL(dr.Item("EntityType_Code").ToString)
End With
                                              
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:

Select allOpen in new window

 

by: numberkruncherPosted on 2009-07-01 at 16:14:14ID: 24759111

The only thing that I can think is that perhaps the RadTree compares each tree node instance with something internal for some reason.

Backup what you have and change the following part. If all of the project tree nodes appear again, then this is the reason why, and we will need to find another way to associate additional information with each node.

Simply change xNode back to "RadTreeNode" and remove the two indicated lines from the With xNode block. This will not fix your problem, but it will indicate whether or not this approach is going to work.

            For Each dr As DataRow In foundRows
                Dim xNode As New RadTreeNode          ' ***** CHANGE
                'format node for given entity
                With xNode
                    .Attributes.Add("Entity_ID", dr.Item("Entity_ID").ToString)
                    .Attributes.Add("Tag", "eClass")
 
        ' ***** REMOVED .EntityID and .EntityType
 
                    .Text = dr.Item("EntityName").ToString
                    .ImageUrl = Navigator_GetImageURL(dr.Item("EntityType_Code").ToString)
                End With

                                              
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:

Select allOpen in new window

 

by: John500Posted on 2009-07-02 at 05:37:04ID: 24762564

I wish I could say that worked but it doesn't.  Same results as the last picture I posted.

For what ever it's worth, I included some write statements so that I could get a better idea of what's going on.  Below you can see the results given the original code and the revised.  Everything in the database is sample data in case you are wondering.

I inserted three WriteToFile() statements.

1)  First statement within  -  kNavigatorMain_Load( ... )
2)  First statement within  -  KNavigator_LoadNode( ... ) As Boolean
3)  After xNode attributes are assigned  ( seen below )

All of this may be obvious to you so forgive the extra information if it is.  Otherwise I see that for 'For Each dr As DataRow In foundRows' the revised code somehow stores two DataRows where the original does not.

Original Code
------------------------------------------------------------------------------------------------------------------------
kNavigatorMain_Load( ByVal LocationID As Integer )

KNavigator_LoadNode( ByRef oDataSource As DataSet, ByRef NodeParent As Telerik.Web.UI.RadTreeNode, ByRef Parent_Id As Integer ) As Boolean )

      Value:        317
      Text:              ABC EAST
KNavigator_LoadNode( ByRef oDataSource As DataSet, ByRef NodeParent As Telerik.Web.UI.RadTreeNode, ByRef Parent_Id As Integer ) As Boolean )

      Value:        1166
      Text:              asdfsdfewef
KNavigator_LoadNode( ByRef oDataSource As DataSet, ByRef NodeParent As Telerik.Web.UI.RadTreeNode, ByRef Parent_Id As Integer ) As Boolean )

      Value:        1168
      Text:              New Office
KNavigator_LoadNode( ByRef oDataSource As DataSet, ByRef NodeParent As Telerik.Web.UI.RadTreeNode, ByRef Parent_Id As Integer ) As Boolean )

      Value:        1184
      Text:              RyoungEun House
KNavigator_LoadNode( ByRef oDataSource As DataSet, ByRef NodeParent As Telerik.Web.UI.RadTreeNode, ByRef Parent_Id As Integer ) As Boolean )
...
...
...
125 nodes total
------------------------------------------------------------------------------------------------------------------------

Revised Code Results
------------------------------------------------------------------------------------------------------------------------
kNavigatorMain_Load( ByVal LocationID As Integer )

KNavigator_LoadNode( ByRef oDataSource As DataSet, ByRef NodeParent As Telerik.Web.UI.RadTreeNode, ByRef Parent_Id As Integer ) As Boolean )

      Value:        317
      Text:        ABC EAST
KNavigator_LoadNode( ByRef oDataSource As DataSet, ByRef NodeParent As Telerik.Web.UI.RadTreeNode, ByRef Parent_Id As Integer ) As Boolean )

      Value:        1166
      Text:        asdfsdfewef
      Value:        5
      Text:        ABC Builders
kNavigatorMain_Load( ByVal LocationID As Integer )

KNavigator_LoadNode( ByRef oDataSource As DataSet, ByRef NodeParent As Telerik.Web.UI.RadTreeNode, ByRef Parent_Id As Integer ) As Boolean )

      Value:        317
      Text:        ABC EAST
KNavigator_LoadNode( ByRef oDataSource As DataSet, ByRef NodeParent As Telerik.Web.UI.RadTreeNode, ByRef Parent_Id As Integer ) As Boolean )

      Value:        1166
      Text:        asdfsdfewef
      Value:        5
      Text:        ABC Builders

NO MORE DATA / NODES
------------------------------------------------------------------------------------------------------------------------


 
                Dim xNode As New RadTreeNode
                'format node for given entity
                With xNode
                    .Attributes.Add("Entity_ID", dr.Item("Entity_ID").ToString)
                    .Attributes.Add("Tag", "eClass")
 
                    ' Use data structure of our custom node!
 
                    .Value = dr.Item("Entity_ID").ToString
                    .Text = dr.Item("EntityName").ToString
                    .ImageUrl = Navigator_GetImageURL(dr.Item("EntityType_Code").ToString)
                End With
 
                Dim xNodeString = ControlChars.Tab + "Value:  " + ControlChars.Tab + xNode.Value.ToString() + ControlChars.NewLine + _
                                  ControlChars.Tab + "Text:  " + ControlChars.Tab + ControlChars.Tab + xNode.Text.ToString()
 
                WriteToFile("C:\ApplicationTree.txt", xNodeString + ControlChars.NewLine)

                                              
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:

Select allOpen in new window

 

by: John500Posted on 2009-07-02 at 06:00:50ID: 24762768

I guess another point worth mentioning is that although the revised code appears to create six nodes ( seen with WriteToFile() ), these nodes never make it to the web page  http://#ID:24755820

 

by: John500Posted on 2009-07-06 at 13:36:13ID: 31598363

As it turns out, a tree node would be populated by an entry to the database.  I had a feeling this was true but couldn't verify last week while a coworker was on vacation.

Thanks

 

by: numberkruncherPosted on 2009-07-07 at 03:18:46ID: 24792867

Hi,

Sorry I was unable to respond to your last two posts. We have been without an Internet connection for 4 days due to damage caused by lightening.

Feel free to tag on links to further questions and if I can help I will.

20120131-EE-VQP-002

3 Ways to Join

30-Day Free Trial

The Experts

98% positive feedback on 31,087 answers since March 2000. angeliii is a Microsoft Most Valuable Professional for his work with MS SQL Server & Develoment.

He has also proven his knowledge of Visual Basic Programming, PHP Scripting and Oracle Databases.

The Experts

97% positive feedback on 10,752 answers since July 2000. lrmoore has more than 18 years experience in the networking industry.

The six-time Mircosoft MVPs specialties include firewalls, virtual private networking, and network management.

Testimonials

"...and excellent source for support... Kind of like having your very own IT dept." Electriciansnet

Testimonials

"I was apprehensive at signing up at first. However... it has already made my life as an IT administrator much easier." JaCrews

Testimonials

"WOW! You guys have great, active, and knowledgeable people on here." moore50

Business Clients

Business Clients

In the Press

"If you’ve got a question... Experts Exchange can supply an answer.”

In the Press

"...an invaluable aid for both IT professionals and those who require tech support."

In the Press

"where IT professionals provide quick answers on just about any topic"

Business Account Plans

Loading Advertisement...