Public Class ClassNodeNavigation Public Shared NODE_CONFIGURABLE_ID As Integer Public Shared MyTreeView As TreeView Public Shared Datatable_Nodes As DataTable Public Shared TREEVIEW_IMAGELIST As ImageList Public Shared Function Return_Node(PARENT_ID As Integer, ParentNode As TreeNode) Dim expression As String expression = "PARENT_GUID = " & PARENT_ID 'Einschränkung auf Type und Parent_Guid Dim foundRows() As DataRow foundRows = Datatable_Nodes.Select(expression) Dim q As Integer For q = 0 To foundRows.GetUpperBound(0) Dim ID9 = foundRows(q)("GUID") Dim LevelEntity9 = foundRows(q)("ENTITY_ID") Dim controlID9 = foundRows(q)("CONTROL_ID") Dim nodetext9 = foundRows(q)("NODE_CAPTION") Dim RECORD_ID = foundRows(q)("RECORD_ID") Dim NODE_CONFIG_ID = foundRows(q)("NODE_CONFIG_ID") ' Node erstellen.. Dim NEW_NODE As TreeNode NEW_NODE = New TreeNode(nodetext9) ClassNodeNavigation.Check_NODE_CONFIG_ID(LevelEntity9) NEW_NODE.Tag = ClassNodeNavigation.CreateNODE_TAG(LevelEntity9, ID9, RECORD_ID, NODE_CONFIG_ID) Dim index = 0 For Each img As String In TREEVIEW_IMAGELIST.Images.Keys If img.Replace("LEVEL#ENTITY", "") = "6" & LevelEntity9.ToString Then Exit For End If index += 1 Next NEW_NODE.ImageIndex = index NEW_NODE.SelectedImageIndex = index ' ..und einfügen ParentNode.Nodes.Add(NEW_NODE) Next ' End Function Public Shared Sub Check_NODE_CONFIG_ID(ENTITY_ID As Integer) Try If CURRENT_DT_NODE_CONFIGURABLE_NODES.Rows.Count > 0 Then 'Prüfen ob es für dieses Level einen konfigurierbaren Knoten gibt Dim result = (From form In CURRENT_DT_NODE_CONFIGURABLE_NODES.AsEnumerable() Select form Where form.Item("ENTITY_ID") = ENTITY_ID).Single() Dim ID = result.Item("GUID") If Not IsNothing(ID) Then ClassNodeNavigation.NODE_CONFIGURABLE_ID = ID CURRENT_NODE_CONFIGURABLE_ID = ID End If Else If LogErrorsOnly = False Then ClassLogger.Add("NO CURRENT_DT_NODE_CONFIGURABLE_NODES", False) End If Catch ex As Exception ClassNodeNavigation.NODE_CONFIGURABLE_ID = 0 CURRENT_NODE_CONFIGURABLE_ID = 0 End Try End Sub Public Shared Function CreateNODE_TAG(Entity As Integer, IDNode As String, Record As Object, NODE_CONFIG_ID As Integer) Dim vType, TagString As String Try If NODE_CONFIGURABLE_ID = NODE_CONFIG_ID Then vType = "CONFIG_NODE-" & NODE_CONFIG_ID.ToString Else vType = "NODE-TYPE-" & NODE_CONFIG_ID.ToString End If If Not IsDBNull(Record) Then TagString = vType & "#" & Entity & "#NODE_ID-" & IDNode & "#RECORD-ID" & Record.ToString Else TagString = vType & "#" & Entity & "#NODE_ID-" & IDNode End If Return TagString Catch ex As Exception ClassLogger.Add(">> Unexpected Error in CreateNODE_TAG (NodeNavigation): " & ex.Message, True) MsgBox("Error in CreateNODE_TAG (NodeNavigation):" & vbNewLine & ex.Message, MsgBoxStyle.Critical) TagString = "ERROR NODETAG_CREATION" Return TagString End Try End Function Public Shared Function CreateTreeViewNodes(DT_TREEVIEW_NODES As DataTable, TREEVIEW_IMAGELIST As ImageList) Try Dim sw As New SW("CreateTreeViewNodes") Dim mytrv As New TreeView Dim ENTITY_ID As Integer Dim expression As String expression = "PARENT_GUID = 0" Dim MAIN_NODES() As DataRow 'Use the Select method to find all rows matching the filter. MAIN_NODES = DT_TREEVIEW_NODES.Select(expression, "SEQUENCE, NODE_CAPTION") ' For each row create a Node For i = 0 To MAIN_NODES.GetUpperBound(0) If ENTITY_ID <> MAIN_NODES(i)("ENTITY_ID") Then ENTITY_ID = MAIN_NODES(i)("ENTITY_ID") ClassNodeNavigation.Check_NODE_CONFIG_ID(MAIN_NODES(i)("ENTITY_ID")) End If Dim NODE_Tag = CreateNODE_TAG(MAIN_NODES(i)("ENTITY_ID"), MAIN_NODES(i)("GUID"), MAIN_NODES(i)("RECORD_ID"), MAIN_NODES(i)("NODE_CONFIG_ID")) Dim MAIN_NODE = New TreeNode(MAIN_NODES(i)("NODE_CAPTION")) '"NODE_CAPTION" MAIN_NODE.Tag = NODE_Tag Dim index As Integer = 0 For Each img As String In TREEVIEW_IMAGELIST.Images.Keys If img = MAIN_NODES(i)("NODE_CONFIG_ID") & "#" & MAIN_NODES(i)("ENTITY_ID") Then Exit For End If index += 1 Next MAIN_NODE.ImageIndex = index MAIN_NODE.SelectedImageIndex = index 'New Font(fontfamily, fontsize, CType(fontstyle, FontStyle)) Dim fontfamily As String Dim fontstyle, fontcolor, fontsize As Integer fontfamily = MAIN_NODES(i)("FONT_FAMILY").ToString fontsize = CInt(MAIN_NODES(i)("FONT_SIZE")) fontstyle = MAIN_NODES(i)("FONT_STYLE") fontcolor = MAIN_NODES(i)("FONT_COLOR") MAIN_NODE.NodeFont = New Font(fontfamily, fontsize, CType(fontstyle, FontStyle)) MAIN_NODE.ForeColor = IntToColor(fontcolor) MAIN_NODE = CheckSubNodes(DT_TREEVIEW_NODES, MAIN_NODES(i)("GUID"), TREEVIEW_IMAGELIST, MAIN_NODE, MAIN_NODES(i)("EXPAND_NODE")) 'Add the node mytrv.Nodes.Add(MAIN_NODE) Next sw.Done() Return mytrv Catch ex As System.Exception ClassLogger.Add(">> Unexpected Error in CreateTreeViewNodes (NodeNavigation): " & ex.Message, True) MsgBox("Error in CreateTreeViewNodes (NodeNavigation):" & vbNewLine & ex.Message, MsgBoxStyle.Critical) Return Nothing End Try End Function Private Shared Function CheckSubNodes(DT_TREEVIEW_NODES As DataTable, PARENT_GUID As Integer, TREEVIEW_IMAGELIST As ImageList, MY_NODE As TreeNode, EXPAND As Boolean) Dim ENTITY_ID As Integer Dim expression As String expression = "PARENT_GUID = " & PARENT_GUID.ToString Dim SUB_NODE_ROW() As DataRow ' Use the Select method to find all rows matching the filter. SUB_NODE_ROW = DT_TREEVIEW_NODES.Select(expression, "SEQUENCE, NODE_CAPTION") ' For each row create a Node For i = 0 To SUB_NODE_ROW.GetUpperBound(0) If ENTITY_ID <> SUB_NODE_ROW(i)("ENTITY_ID") Then ENTITY_ID = SUB_NODE_ROW(i)("ENTITY_ID") ClassNodeNavigation.Check_NODE_CONFIG_ID(SUB_NODE_ROW(i)("ENTITY_ID")) End If Dim NODE_Tag = CreateNODE_TAG(SUB_NODE_ROW(i)("ENTITY_ID"), SUB_NODE_ROW(i)("GUID"), SUB_NODE_ROW(i)("RECORD_ID"), SUB_NODE_ROW(i)("NODE_CONFIG_ID")) Dim SUB_NODE = New TreeNode(SUB_NODE_ROW(i)("NODE_CAPTION")) SUB_NODE.Tag = NODE_Tag Dim index As Integer = 0 For Each img As String In TREEVIEW_IMAGELIST.Images.Keys If img = SUB_NODE_ROW(i)("NODE_CONFIG_ID") & "#" & SUB_NODE_ROW(i)("ENTITY_ID") Then Exit For End If index += 1 Next SUB_NODE.ImageIndex = index SUB_NODE.SelectedImageIndex = index Dim fontfamily As String Dim fontstyle, fontcolor, fontsize As Integer fontfamily = SUB_NODE_ROW(i)("FONT_FAMILY").ToString fontsize = CInt(SUB_NODE_ROW(i)("FONT_SIZE")) fontstyle = SUB_NODE_ROW(i)("FONT_STYLE") fontcolor = SUB_NODE_ROW(i)("FONT_COLOR") SUB_NODE.NodeFont = New Font(fontfamily, fontsize, CType(fontstyle, FontStyle)) SUB_NODE.ForeColor = IntToColor(fontcolor) CheckSubNodes(DT_TREEVIEW_NODES, SUB_NODE_ROW(i)("GUID"), TREEVIEW_IMAGELIST, SUB_NODE, SUB_NODE_ROW(i)("EXPAND_NODE")) 'Add the node MY_NODE.Nodes.Add(SUB_NODE) 'If EXPAND = True Then ' MY_NODE.ExpandAll() 'End If Next Return MY_NODE End Function Private Shared Function FindNode(tncoll As TreeNodeCollection, PARENT_GUID As Integer) As TreeNode Try Dim tnFound As TreeNode For Each tnCurr As TreeNode In tncoll If tnCurr.Tag.ToString.Contains("#NODE_ID-" & PARENT_GUID) Then Return tnCurr End If tnFound = FindNode(tnCurr.Nodes, PARENT_GUID) If tnFound IsNot Nothing Then Return tnFound End If Next Return Nothing Catch ex As Exception ClassLogger.Add(">> Unexpected Error in FindNode (NodeNavigation): " & ex.Message, True) MsgBox("Error in FindNode (NodeNavigation):" & vbNewLine & ex.Message, MsgBoxStyle.Critical) Return Nothing End Try End Function Public Shared Function Return_ENTITY_FOR_TAG(NodeString As String) If IsNumeric(NodeString) Then Return NodeString Else Try Dim staticListItems = NodeString.Split("#") Return staticListItems(1) Catch ex As Exception ClassLogger.Add("Unexpected Error in Return_ENTITY_FOR_TAG ('" & NodeString & "'): " & ex.Message, True) Return 0 End Try End If End Function Public Shared Function Return_RECORD_forTag(NodeString As String) Dim sw As New SW("Return_RECORD_forTag") If IsNumeric(NodeString) Then Return NodeString Else Dim staticListItems = NodeString.Split("#") If staticListItems(3).Contains("RECORD-ID") Then Try Dim _RECORD = staticListItems(3).ToString.Replace("RECORD-ID", "") If IsNumeric(_RECORD) Then sw.Done() Return _RECORD Else sw.Done() Return 0 End If Catch ex As Exception sw.Done() ClassLogger.Add("Unexpected Error in Return_RECORD_forTag ('" & NodeString & "'): " & ex.Message, True) Return 0 End Try Else sw.Done() Return 0 End If End If End Function Public Shared Function Return_NODEID_forTag(NodeString As String) 'If NODE_CONFIGURABLE_ID = NODE_CONFIG_ID Then ' vType = "CONFIG_NODE-" & NODE_CONFIG_ID.ToString 'Else ' vType = "NODE-TYPE-" & NODE_CONFIG_ID.ToString 'End If 'If Not IsDBNull(Record) Then ' TagString = vType & "#" & Entity & "#" & "NODE_ID-" & IDNode & "#RECORD-ID" & Record.ToString 'Else ' TagString = vType & "#" & Entity & "#" & "NODE_ID-" & IDNode 'End If If IsNumeric(NodeString) Then Return NodeString Else Dim staticListItems = NodeString.Split("#") If staticListItems(2).Contains("NODE_ID") Then Return staticListItems(2).ToString.Replace("NODE_ID-", "") Else Return 0 End If End If End Function End Class