Imports System.ComponentModel Imports BLV_Studio.EnumExtend Imports FlexCell Public Class ServiceAttribute Public G_hostNode As DeviceChildNodeClass Public G_input As String Private g_dicComboBox1 As Dictionary(Of String, String) Public G_result As String Enum STcolname 行号 = 0 延时 单位 打开方式 服务类型 显示服务 max End Enum Private Dic_1, Dic_2, Dic_3, Dic_4 As List(Of String) Private Sub ServiceAttribute_Load(sender As Object, e As EventArgs) Handles MyBase.Load InitTable() If IsNothing(G_hostNode) Then MsgBox("未选择主机,请先选择主机再进行配置!") Me.DialogResult = System.Windows.Forms.DialogResult.Cancel Me.Close() Return End If '服务方式 Dic_1 = New List(Of String) '执行方式 Dic_2 = New List(Of String) '时间 Dic_3 = New List(Of String) '单位 Dic_4 = New List(Of String) For Each node In G_hostNode.Nodes Dic_1.Add($"{node.LoopAddr}:{node.Name }") Next Dic_2.AddRange({"2:close", "1:open"}) For i = 0 To 255 Dic_3.Add(i) Next Dic_4.AddRange({"ms", "s", "m", "H", "Day"}) LoadInputText(G_input) End Sub Public Shared Function CheckDataIsOk(datastr As String, hostNode As DeviceChildNodeClass) As Boolean If String.IsNullOrEmpty(datastr) Then Return True Dim buff() As String = datastr.Split(vbLf) Dim isok As Boolean For Each index In buff isok = False Dim buf() As String = index.Split(",") If buf.Length <> 5 Then Return False Dim intbuf(3) As Integer If Not (Integer.TryParse(buf(0), intbuf(0)) And Integer.TryParse(buf(1), intbuf(1)) And Integer.TryParse(buf(2), intbuf(2)) And Integer.TryParse(buf(3), intbuf(3))) Then Return False If IsNothing(hostNode) Then Return False For Each node In hostNode.Nodes If node.LoopAddr.Equals(intbuf(0).ToString) Then isok = True If intbuf(1) = 2 OrElse intbuf(1) = 1 Then If intbuf(2) >= 0 OrElse intbuf(2) <= 255 Then If intbuf(3) >= 1 OrElse intbuf(3) <= 5 Then Exit For End If Return False End If Return False End If Return False End If Next If isok Then Continue For End If Return False Next Return True End Function Public Shared Function Getservername(datastr As String, hostNode As DeviceChildNodeClass) As String Dim result As String = String.Empty For Each node In hostNode.Nodes If node.LoopAddr.Equals(datastr) Then Return node.Name End If Next Return result End Function Private Sub LoadInputText(inputstr As String) If String.IsNullOrEmpty(inputstr) Then Return Dim buff() As String = inputstr.Split(vbLf) Dim C1, C2, C3, C4 As String For Each index In buff C1 = String.Empty C2 = String.Empty C3 = String.Empty C4 = String.Empty Table_Grid1.AddItem("") Dim buf() As String = index.Split(",") If buf.Length > 0 Then For i As Integer = 0 To Dic_1.Count - 1 If Dic_1(i).ToString.Contains(buf(0)) Then C1 = Dic_1(i) Table_Grid1.Cell(Table_Grid1.Rows - 1, STcolname.服务类型).Text = C1 Exit For End If Next End If If buf.Length > 1 Then For i As Integer = 0 To Dic_2.Count - 1 If Dic_2(i).ToString.Contains(buf(1)) Then C2 = Dic_2(i) Table_Grid1.Cell(Table_Grid1.Rows - 1, STcolname.打开方式).Text = C2 Exit For End If Next End If If buf.Length > 2 Then For i As Integer = 0 To Dic_3.Count - 1 If Dic_3(i).ToString.Contains(buf(2)) Then C3 = Dic_3(i) Table_Grid1.Cell(Table_Grid1.Rows - 1, STcolname.延时).Text = C3 Exit For End If Next End If If buf.Length > 3 Then Dim cbuf As String = FGetDelayUnit(buf(3)) For i As Integer = 0 To Dic_4.Count - 1 If Dic_4(i).ToString.Equals(cbuf) Then C4 = cbuf Table_Grid1.Cell(Table_Grid1.Rows - 1, STcolname.单位).Text = C4 Exit For End If Next End If If String.IsNullOrEmpty(C1) OrElse String.IsNullOrEmpty(C2) OrElse String.IsNullOrEmpty(C3) OrElse String.IsNullOrEmpty(C4) Then If String.IsNullOrEmpty(C1) Then Table_Grid1.Range(Table_Grid1.Rows - 1, STcolname.服务类型, Table_Grid1.Rows - 1, STcolname.服务类型).BackColor = Color.OrangeRed ElseIf String.IsNullOrEmpty(C2) Then Table_Grid1.Range(Table_Grid1.Rows - 1, STcolname.打开方式, Table_Grid1.Rows - 1, STcolname.打开方式).BackColor = Color.OrangeRed ElseIf String.IsNullOrEmpty(C3) Then Table_Grid1.Range(Table_Grid1.Rows - 1, STcolname.延时, Table_Grid1.Rows - 1, STcolname.延时).BackColor = Color.OrangeRed ElseIf String.IsNullOrEmpty(C4) Then Table_Grid1.Range(Table_Grid1.Rows - 1, STcolname.单位, Table_Grid1.Rows - 1, STcolname.单位).BackColor = Color.OrangeRed End If Continue For Else Table_Grid1.Range(Table_Grid1.Rows - 1, 0, Table_Grid1.Rows - 1, STcolname.服务类型).BackColor = Color.White End If Next End Sub Public Function showSelectedIndexVal(c1 As String, c2 As String, c3 As String, c4 As String, c5 As String) As String Dim reslit As String = String.Empty Dim strbuf1() As String = c1.Split(":") Dim strbuf2() As String = c2.Split(":") Dim t As String = GetDelayUnit(c4) reslit = $"{strbuf1(0)},{strbuf2(0)},{c3},{t},{c5}" Return reslit End Function Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click G_result = String.Empty Dim indexstr As String = String.Empty Dim C1, C2, C3, C5, C4 As String For i = 1 To Table_Grid1.Rows - 1 C1 = Table_Grid1.Cell(i, STcolname.服务类型).Text.Trim C2 = Table_Grid1.Cell(i, STcolname.打开方式).Text.Trim C3 = Table_Grid1.Cell(i, STcolname.延时).Text.Trim C4 = Table_Grid1.Cell(i, STcolname.单位).Text.Trim C5 = Table_Grid1.Cell(i, STcolname.显示服务).Text.Trim If String.IsNullOrEmpty(C1) OrElse String.IsNullOrEmpty(C2) OrElse String.IsNullOrEmpty(C3) OrElse String.IsNullOrEmpty(C4) Then MsgBox($"添加服务数据异常,行号:{i}") If String.IsNullOrEmpty(C1) Then Table_Grid1.Range(i, STcolname.服务类型, i, STcolname.服务类型).BackColor = Color.OrangeRed End If If String.IsNullOrEmpty(C2) Then Table_Grid1.Range(i, STcolname.打开方式, i, STcolname.打开方式).BackColor = Color.OrangeRed End If If String.IsNullOrEmpty(C3) Then Table_Grid1.Range(i, STcolname.延时, i, STcolname.延时).BackColor = Color.OrangeRed End If If String.IsNullOrEmpty(C4) Then Table_Grid1.Range(i, STcolname.单位, i, STcolname.单位).BackColor = Color.OrangeRed End If Return End If indexstr = showSelectedIndexVal(C1, C2, C3, C4, C5) G_result = $"{G_result}{vbLf }{indexstr}" Next G_result = G_result.Trim Me.DialogResult = System.Windows.Forms.DialogResult.OK Me.Close() Return End Sub Private Function GetDelayUnit(str As String) As String Dim result As Integer Select Case str Case "ms" result = 1 Case "s" result = 2 Case "m" result = 3 Case "H" result = 4 Case "Day" result = 5 Case Else result = 1 End Select Return result.ToString End Function Private Function FGetDelayUnit(str As String) As String Dim result As String = String.Empty Select Case str Case "1" result = "ms" Case "2" result = "s" Case "3" result = "m" Case "4" result = "H" Case "5" result = "Day" Case Else End Select Return result.ToString End Function Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click Table_Grid1.AddItem("") Table_Grid1.Cell(Table_Grid1.Rows - 1, STcolname.延时).Text = "0" Table_Grid1.Cell(Table_Grid1.Rows - 1, STcolname.单位).Text = "ms" Table_Grid1.Cell(Table_Grid1.Rows - 1, STcolname.打开方式).Text = "1:Open" End Sub Private Sub Table_Grid1_CellChange(Sender As Object, e As Grid.CellChangeEventArgs) Handles Table_Grid1.CellChange If e.Row > 0 Then If e.Col = STcolname.延时 Then If String.IsNullOrEmpty(Table_Grid1.Cell(e.Row, e.Col).Text) Then Table_Grid1.Cell(e.Row, e.Col).Text = 0 Return End If For Each node In Dic_3 If node.Equals(Table_Grid1.Cell(e.Row, e.Col).Text) Then Return End If Next Table_Grid1.Cell(e.Row, e.Col).Text = 0 End If If String.IsNullOrEmpty(Table_Grid1.Cell(e.Row, e.Col).Text) Then Return Table_Grid1.Cell(e.Row, e.Col).BackColor = Color.White End If End Sub Private Sub InitTable() Table_Grid1.Rows = 1 Table_Grid1.Cols = STcolname.max Table_Grid1.ExtendLastCol = True For i = 0 To STcolname.max - 1 Dim colorValue As STcolname = CType([Enum].Parse(GetType(STcolname), i), STcolname) Table_Grid1.Cell(0, i).Text = EnumExtender.GetEnumDescription(colorValue) ' [Enum].GetName(GetType(STcolname), i) Select Case i Case STcolname.行号 With Table_Grid1.Column(i) .Width = 50 '.Visible = True .Locked = True End With Case STcolname.延时 With Table_Grid1.Column(i) .Width = 50 .Alignment = FlexCell.AlignmentEnum.CenterCenter .CellType = CellTypeEnum.ComboBox End With 'Table_Grid1.ComboBox(i).Locked = True Case STcolname.单位 With Table_Grid1.Column(i) .Width = 50 .Alignment = FlexCell.AlignmentEnum.CenterCenter .CellType = CellTypeEnum.ComboBox End With Table_Grid1.ComboBox(i).Locked = True Case STcolname.打开方式 With Table_Grid1.Column(i) .Width = 80 .Alignment = FlexCell.AlignmentEnum.CenterCenter .CellType = CellTypeEnum.ComboBox End With Table_Grid1.ComboBox(i).Locked = True Case STcolname.服务类型 With Table_Grid1.Column(i) .Width = 180 .Alignment = FlexCell.AlignmentEnum.CenterCenter .CellType = CellTypeEnum.ComboBox End With Table_Grid1.ComboBox(i).Locked = True Case STcolname.显示服务 With Table_Grid1.Column(i) .Width = 30 .Alignment = FlexCell.AlignmentEnum.CenterCenter .CellType = CellTypeEnum.CheckBox End With Case Else Exit For End Select Next End Sub Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click If Table_Grid1.ActiveCell.Row > 0 Then Table_Grid1.Row(Table_Grid1.ActiveCell.Row).Delete() End If End Sub Private Sub Table_Grid1_ComboDropDown(Sender As Object, e As Grid.ComboDropDownEventArgs) Handles Table_Grid1.ComboDropDown If e.Row > 0 Then Table_Grid1.ComboBox(e.Col).Items.Clear() Select Case e.Col Case STcolname.行号 Return Case STcolname.延时 Table_Grid1.ComboBox(e.Col).Items.AddRange(Dic_3.ToArray) Case STcolname.单位 Table_Grid1.ComboBox(e.Col).Items.AddRange(Dic_4.ToArray) Case STcolname.打开方式 Table_Grid1.ComboBox(e.Col).Items.AddRange(Dic_2.ToArray) Case STcolname.服务类型 Table_Grid1.ComboBox(e.Col).Items.AddRange(Dic_1.ToArray) Case Else End Select End If End Sub End Class