Imports System.Data.SqlClient Imports DevExpress.Utils 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 IMAGE_COLLECTION As ImageCollection Public Shared Function CreateNodeProcedure(RECORD_ID As Integer, NODE_CONFIG_ID As Integer, NODE_CAPTION As String, NODE_ID1 As String, NODE_PARENT_ID As String, ADDED_WHO As String) Try Dim connection As New SqlConnection connection.ConnectionString = MyConnectionString Using cmd As New SqlCommand("PRPMO_CREATE_NODE", connection) cmd.CommandType = CommandType.StoredProcedure '@pNODE_PARENT_ID INT, @pADDED_WHO cmd.Parameters.AddWithValue("@pRECORD_ID", RECORD_ID) cmd.Parameters.AddWithValue("@pNODE_CONFIG_ID", NODE_CONFIG_ID) cmd.Parameters.AddWithValue("@pNODE_CAPTION", NODE_CAPTION) cmd.Parameters.AddWithValue("@pNODE_ID1", NODE_ID1) cmd.Parameters.AddWithValue("@pNODE_PARENT_ID", NODE_PARENT_ID) cmd.Parameters.AddWithValue("@pADDED_WHO", ADDED_WHO) cmd.Parameters.Add("@pRESULT", SqlDbType.Int) cmd.Parameters("@pRESULT").Direction = ParameterDirection.Output connection.Open() cmd.ExecuteNonQuery() connection.Close() Dim GUID As Integer = cmd.Parameters("@pRESULT").Value Return GUID End Using Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Critical, "Error in CreateNodeProcedure: ") LOGGER.Warn("Error in CreateNodeProcedure: " & ex.Message) Return 0 End Try End Function Public Shared Function CREATE_IMAGE_COLL(DT_IMAGELIST As DataTable) IMAGE_COLLECTION = New ImageCollection For Each row As DataRow In DT_IMAGELIST.Rows Try Dim bimage = row.Item("NODE_IMAGE") If Not IsDBNull(bimage) Then Dim Node_image = ByteArrayToBitmap(bimage) IMAGE_COLLECTION.AddImage(Node_image, row.Item("GUID")) 'row.Item("GUID").ToString & "#" & row.Item("ENTITY_ID") End If Catch ex As Exception End Try Next End Function 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) 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, myTreeNode As TreeNode) Try If myTreeNode Is Nothing Then Exit Sub End If Dim NODE_ID Dim NODE_CONFIG_ID Dim staticListItems = myTreeNode.Tag.Split("#") LOGGER.Debug($"SUB CNCID.myTreeNode.Tag [{myTreeNode.Tag.ToString}]", False) If staticListItems(0).Contains("NODE-TYPE") Or staticListItems(0).Contains("CONFIG_NODE") Then ' NODE_ID = staticListItems(0).ToString.Replace("NODE-TYPE-", "") NODE_ID = Return_NODEID_forTag(myTreeNode.Tag) NODE_CONFIG_ID = Return_NODE_CONFIG_ID_forTag(myTreeNode.Tag) LOGGER.Debug($"SUB CNCID.Checking nodeconfig on NODE_ID [{NODE_ID.ToString}] and NODE_CONFIG_ID [{NODE_CONFIG_ID.ToString}]", False) Else LOGGER.Debug($"Attention no NODE-TYPE in staticListItems(0) [{staticListItems(0).ToString}]", False) End If If NODE_CONFIGURABLE_NODES_DT.Rows.Count > 0 And IsNumeric(NODE_ID) Then 'Prüfen ob es für dieses Level einen konfigurierbaren Knoten gibt Dim oTable As DataTable = NODE_CONFIGURABLE_NODES_DT ' Get rows with PARENT_ID = NODE_ID Dim result() As DataRow = oTable.Select("PARENT_NODE = " & NODE_CONFIG_ID) Dim count As Integer Dim ID ' Loop. For Each row As DataRow In result count += 1 ID = row.Item("GUID") CURRENT_NODE_IMAGE = row.Item("NODE_IMAGE") If count = 2 Then Exit For Next 'Dim result = (From form In NODE_CONFIGURABLE_NODES_DT.AsEnumerable() ' Select form ' Where form.Item("PARENT_NODE") = NODE_ID).Single() If Not IsNothing(ID) Then LOGGER.Debug($"SUB CNCID.We have a NODE_CONFIGURABLE_ID [{ID.ToString}]!!", False) ClassNodeNavigation.NODE_CONFIGURABLE_ID = ID CURRENT_NODE_CONFIGURABLE_ID = ID Else LOGGER.Debug($"SUB CNCID.NODE_CONFIGURABLE_ID is nothing!!", False) ' LOGGER.Debug("CURRENT_NODE_CONFIGURABLE_ID would be nothing...", False) CURRENT_NODE_CONFIGURABLE_ID = 0 End If Else If IsNumeric(NODE_ID) = False Then LOGGER.Debug("SUB CNCID.NODE_ID is not numeric", False) Else LOGGER.Debug("SUB CNCID.NO NODE_CONFIGURABLE_NODES_DT", False) End If CURRENT_NODE_CONFIGURABLE_ID = 0 End If Catch ex As Exception LOGGER.Debug("SUB CNCID.CURRENT_NODE_CONFIGURABLE_ID would be nothing(1)...", False) 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 LOGGER.Warn("Unexpected Error in CreateNODE_TAG (NodeNavigation): " & ex.Message) 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"), Nothing) 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") Then ' & "#" & MAIN_NODES(i)("ENTITY_ID") Exit For End If index += 1 Next MAIN_NODE.ImageIndex = index MAIN_NODE.SelectedImageIndex = index 'New Font(fontfamily, fontsize, CType(fontstyle, FontStyle)) Dim fontfamily, backcolor 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") backcolor = MAIN_NODES(i)("BACK_COLOR") MAIN_NODE.NodeFont = New Font(fontfamily, fontsize, CType(fontstyle, FontStyle)) MAIN_NODE.ForeColor = IntToColor(fontcolor) Try If backcolor <> String.Empty Then MAIN_NODE.BackColor = Color.FromName(backcolor) End If Catch ex As Exception LOGGER.Warn("Unexpected Error in Formatting NodeColor (CreateTreViewNodes): " & ex.Message) End Try 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 LOGGER.Warn("Unexpected Error in CreateTreeViewNodes (NodeNavigation-CreateTreViewNodes): " & ex.Message) 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"), MY_NODE) 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")) If SUB_NODE_ROW(i)("NODE_CAPTION").ToString.Contains("Neuer") Then Console.WriteLine(SUB_NODE_ROW(i)("NODE_CAPTION")) End If Dim SUB_NODE = New TreeNode(SUB_NODE_ROW(i)("NODE_CAPTION")) SUB_NODE.Tag = NODE_Tag Dim index As Integer = 0 For Each imgkey As String In TREEVIEW_IMAGELIST.Images.Keys If SUB_NODE_ROW(i)("NODE_CONFIG_ID") = "34" Then Console.WriteLine(SUB_NODE_ROW(i)("NODE_CONFIG_ID")) End If Dim NODE_CONFIG_ID = SUB_NODE_ROW(i)("NODE_CONFIG_ID") If imgkey = SUB_NODE_ROW(i)("NODE_CONFIG_ID") Then '& "#" & SUB_NODE_ROW(i)("ENTITY_ID") 'found the key for this node Exit For End If index += 1 Next SUB_NODE.ImageIndex = index SUB_NODE.SelectedImageIndex = index Dim fontfamily, backcolor 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") backcolor = SUB_NODE_ROW(i)("BACK_COLOR") SUB_NODE.NodeFont = New Font(fontfamily, fontsize, CType(fontstyle, FontStyle)) SUB_NODE.ForeColor = IntToColor(fontcolor) Try If backcolor <> String.Empty Then SUB_NODE.BackColor = Color.FromName(backcolor) Dim icolor = SUB_NODE.BackColor End If Catch ex As Exception LOGGER.Warn("Unexpected Error in Formatting NodeColor (Subnodes): " & ex.Message) End Try 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 LOGGER.Warn("Unexpected Error in FindNode (NodeNavigation): " & ex.Message) 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 LOGGER.Warn("Unexpected Error in Return_ENTITY_FOR_TAG ('" & NodeString & "'): " & ex.Message) 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() LOGGER.Warn("Unexpected Error in Return_RECORD_forTag ('" & NodeString & "'): " & ex.Message) 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 Public Shared Function Return_NODE_CONFIG_ID_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 'NODE-TYPE-17#5#NODE_ID-2 If IsNumeric(NodeString) Then Return NodeString Else Dim staticListItems = NodeString.Split("#") If staticListItems(0).Contains("NODE-TYPE") Then Return staticListItems(0).ToString.Replace("NODE-TYPE-", "") ElseIf staticListItems(0).Contains("CONFIG_NODE") Then Return staticListItems(0).ToString.Replace("CONFIG_NODE-", "") Else Return 0 End If End If End Function End Class