批量粘贴与批量撤销功能上线

This commit is contained in:
2025-05-15 11:12:31 +08:00
parent 88c4699a48
commit 841c866cd8
7 changed files with 401 additions and 219 deletions

View File

@@ -64,7 +64,19 @@ Namespace UTSModule.Station
''' <summary>节点执行可撤销事件</summary>
Public Event PlanGridCommandChanged(ByVal sender As Object, ByVal e As EventArgs)
''' <summary>粘贴操作计时器</summary>
Private WithEvents _userActionTimer As New Timer()
''' <summary>计时器超时时间</summary>
Private Const UserActionTimeout As Integer = 300 ' ms
Private _dicTextChangedRowNode As New Dictionary(Of Integer, TextChangedRowNode) '记录文本修改的行号和节点对象
''' <summary>
''' 构造函数
''' </summary>
Sub New()
NodeStartRow = 1
@@ -77,8 +89,58 @@ Namespace UTSModule.Station
_testCmdManager = TestCmdManager.CreateManager()
_errCodeManager = ErrCodeManager.CreateManager()
_userActionTimer.Interval = UserActionTimeout
_userActionTimer.Stop()
End Sub
''' <summary>
''' 表格内容改变处理事件
''' </summary>
Private Sub OnUserAction(node As RowNode)
If CommandManager.IsRuning Then Return
' 每次用户操作都重置计时器
_userActionTimer.Stop()
_userActionTimer.Start()
'记录当前活动节点
If Not _dicTextChangedRowNode.ContainsKey(node.RowListIndex) Then
_dicTextChangedRowNode.Add(node.RowListIndex, New TextChangedRowNode With {.BeforeRowNode = node.Clone})
End If
End Sub
Private Sub OnUserActionEnd(node As RowNode)
If CommandManager.IsRuning Then Return
'记录当前活动节点
If _dicTextChangedRowNode.ContainsKey(node.RowListIndex) Then
_dicTextChangedRowNode(node.RowListIndex).AfterRowNode = node.Clone
End If
End Sub
''' <summary>
''' 粘贴操作计时器超时处理事件
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub _userActionTimer_Tick(sender As Object, e As EventArgs) Handles _userActionTimer.Tick
_userActionTimer.Stop()
OnUserActionTimeout()
End Sub
Private Sub OnUserActionTimeout()
If CommandManager.IsRuning = False Then
CommandManager.AddUndoCommand(New GridNodeTextChangedCommand(Me, _dicTextChangedRowNode))
RaiseEvent PlanGridCommandChanged(Nothing, Nothing)
End If
_dicTextChangedRowNode = New Dictionary(Of Integer, TextChangedRowNode)
End Sub
''' <summary>
''' 屏蔽表格引发自定义事件,避免行节点内容修改todo:暂未完成
''' </summary>
@@ -474,7 +536,7 @@ Namespace UTSModule.Station
Return Color.DarkSlateGray
End If
Case "ComPort"
Return Color.DarkCyan
Return Color.Olive
Case "UtsComPort"
Return Color.SeaGreen
Case "Converter"
@@ -852,21 +914,26 @@ Namespace UTSModule.Station
Private Function ParamsToString(params As List(Of TestCmdParam)) As String
Return String.Join($" {_paramChar} ", params.Select(Function(p) p.Value))
'Dim result As New StringBuilder
'For i As Integer = 0 To params.Count - 1
' If i = 0 Then
' result.Append(params(i).Value)
' Else
' result.Append($" {_paramChar} {params(i).Value}")
' End If
'Next
'Return result.ToString()
End Function
Public Sub UpdateGrid2(node As RowNode)
Dim row As Integer = node.RowListIndex
Dim rowNode As RowNode = _headNode.RowList(row)
rowNode.CopyFrom(node)
_uploading = True
UpdateGrid(_grd, row, rowNode)
_uploading = False
'触发事件
If SkipEvent Then Return
Dim event2 As New PlanNodeSelectChangedEventArgs With {.Node = node,
.LineNumber = row,
.LineActionEn = node.Action
}
RaiseEvent PlanNodeSelectChanged(_grd, event2)
End Sub
Public Sub UpdateGrid(grd As Grid, row As Integer, node As RowNode)
Dim rowCmdType As String
@@ -1012,13 +1079,13 @@ Namespace UTSModule.Station
Private Sub CommandChanged(node As RowNode)
_grd.Cell(node.RowListIndex, ColNames.Parameters).Text = ParamsToString(node.Parameters)
_grd.Cell(node.RowListIndex, ColNames.Action).Text = IIf(node.Action, "1", "0").ToString
_grd.Cell(node.RowListIndex, ColNames.Parameters).Text = ParamsToString(node.Parameters)
End Sub
Private Sub CommandTypeChanged(node As RowNode)
_grd.Cell(node.RowListIndex, ColNames.Command).Text = " "
_grd.Cell(node.RowListIndex, ColNames.Action).Text = IIf(node.Action, "1", "0").ToString
_grd.Cell(node.RowListIndex, ColNames.Command).Text = node.Command
_grd.Cell(node.RowListIndex, ColNames.Parameters).Text = ParamsToString(node.Parameters)
End Sub
@@ -1055,12 +1122,11 @@ Namespace UTSModule.Station
Dim changeType As RowNodeChangedEventArgs.RowNodeChangeType
changeType = RowNodeChangedEventArgs.RowNodeChangeType.None
Dim cmd As ICommand
Dim beforeNode As RowNode = node.Clone()
OnUserAction(beforeNode)
Select Case e.Col
Case ColNames.[Pause]
cmd = New GridNodeTextChangedCommand(_grd, e.Row, e.Col, node.Pause.ToString(), _grd.Cell(e.Row, e.Col).Text)
node.[Pause] = _grd.Cell(e.Row, e.Col).BooleanValue
If node.[Pause] Then
_grd.Cell(e.Row, e.Col).BackColor = Color.Red
@@ -1068,8 +1134,6 @@ Namespace UTSModule.Station
_grd.Cell(e.Row, e.Col).BackColor = Color.White
End If
Case ColNames.Action
cmd = New GridNodeTextChangedCommand(_grd, e.Row, e.Col, node.Action.ToString(), _grd.Cell(e.Row, e.Col).Text)
node.Action = _grd.Cell(e.Row, e.Col).BooleanValue
changeType = RowNodeChangedEventArgs.RowNodeChangeType.Action
If node.RowType = RowNode.RowTypeEnum.FixedModule Then
@@ -1079,8 +1143,6 @@ Namespace UTSModule.Station
NodeActionChanged(node)
Case ColNames.Description
cmd = New GridNodeTextChangedCommand(_grd, e.Row, e.Col, node.Description.ToString(), _grd.Cell(e.Row, e.Col).Text)
node.Description = _grd.Cell(e.Row, e.Col).Text
changeType = RowNodeChangedEventArgs.RowNodeChangeType.Description
Case ColNames.[Label]
@@ -1093,7 +1155,6 @@ Namespace UTSModule.Station
_uploading = False
Return
Else
cmd = New GridNodeTextChangedCommand(_grd, e.Row, e.Col, node.Label.ToString(), _grd.Cell(e.Row, e.Col).Text)
If Not String.IsNullOrEmpty(node.Label) Then RemoveLabelName(node.Label) '移出之前记录标签名称
node.Label = labelName
@@ -1107,8 +1168,6 @@ Namespace UTSModule.Station
changeType = RowNodeChangedEventArgs.RowNodeChangeType.Label
End If
Case ColNames.ControlType
cmd = New GridNodeTextChangedCommand(_grd, e.Row, e.Col, node.ControlType.ToString(), _grd.Cell(e.Row, e.Col).Text)
node.ControlType = _grd.Cell(e.Row, e.Col).Text
If String.IsNullOrWhiteSpace(node.ControlType) Then
node.RowType = RowNode.RowTypeEnum.Flow
@@ -1119,11 +1178,11 @@ Namespace UTSModule.Station
Case ColNames.CommandType
If String.Compare(node.CommandType, _grd.Cell(e.Row, e.Col).Text) <> 0 Then
cmd = New GridNodeTextChangedCommand(_grd, e.Row, e.Col, node.CommandType.ToString(), _grd.Cell(e.Row, e.Col).Text)
node.CommandType = _grd.Cell(e.Row, e.Col).Text
node.Command = ""
node.Parameters.Clear()
node.Action = Not String.IsNullOrWhiteSpace(node.Command)
CommandTypeChanged(node)
changeType = RowNodeChangedEventArgs.RowNodeChangeType.CommandType
@@ -1132,17 +1191,9 @@ Namespace UTSModule.Station
NodeActionChanged(node)
Case ColNames.Command
If node.Command <> _grd.Cell(e.Row, e.Col).Text Then
cmd = New GridNodeTextChangedCommand(_grd, e.Row, e.Col, node.Command.ToString(), _grd.Cell(e.Row, e.Col).Text)
node.Command = _grd.Cell(e.Row, e.Col).Text
If String.IsNullOrWhiteSpace(node.Command) Then
node.Action = False
Else
node.Action = True
End If
node.Parameters.Clear()
node.Action = Not String.IsNullOrWhiteSpace(node.Command)
'拷贝所有参数到当前节点信息中
Dim planCommand As TestCmd = _testCmdManager.GetCommand(node.CommandType, node.Command)
@@ -1155,9 +1206,6 @@ Namespace UTSModule.Station
changeType = RowNodeChangedEventArgs.RowNodeChangeType.Command
End If
Case ColNames.Parameters
Dim pStr As String = ParamsToString(node.Parameters)
cmd = New GridNodeTextChangedCommand(_grd, e.Row, e.Col, pStr, _grd.Cell(e.Row, e.Col).Text)
Dim str() As String = _grd.Cell(e.Row, e.Col).Text.Split(New Char() {_paramChar})
For i As Integer = 0 To node.Parameters.Count - 1
@@ -1169,8 +1217,6 @@ Namespace UTSModule.Station
Next
changeType = RowNodeChangedEventArgs.RowNodeChangeType.Parameters
Case ColNames.SaveToDb
cmd = New GridNodeTextChangedCommand(_grd, e.Row, e.Col, node.SaveToDb.ToString(), _grd.Cell(e.Row, e.Col).Text)
node.SaveToDb = _grd.Cell(e.Row, e.Col).BooleanValue
changeType = RowNodeChangedEventArgs.RowNodeChangeType.SaveToDb
If node.RowType = RowNode.RowTypeEnum.FixedModule Then
@@ -1189,7 +1235,6 @@ Namespace UTSModule.Station
_uploading = False
Return
Else
cmd = New GridNodeTextChangedCommand(_grd, e.Row, e.Col, node.RecordName.ToString(), recordName)
If IsExistRecordName(node.RecordName) Then RemoveRecordName(node.RecordName) '移出之前记录名称
node.RecordName = recordName
@@ -1199,31 +1244,21 @@ Namespace UTSModule.Station
changeType = RowNodeChangedEventArgs.RowNodeChangeType.RecordName
End If
Case ColNames.Retry
cmd = New GridNodeTextChangedCommand(_grd, e.Row, e.Col, node.Retry.ToString(), _grd.Cell(e.Row, e.Col).Text)
node.Retry = _grd.Cell(e.Row, e.Col).IntegerValue
changeType = RowNodeChangedEventArgs.RowNodeChangeType.Retry
Case ColNames.RetryInterval
cmd = New GridNodeTextChangedCommand(_grd, e.Row, e.Col, node.RetryInterval.ToString(), _grd.Cell(e.Row, e.Col).Text)
node.RetryInterval = _grd.Cell(e.Row, e.Col).IntegerValue
changeType = RowNodeChangedEventArgs.RowNodeChangeType.RetryInterval
Case ColNames.ErrorCode
cmd = New GridNodeTextChangedCommand(_grd, e.Row, e.Col, node.ErrorCode.ToString(), _grd.Cell(e.Row, e.Col).Text)
node.ErrorCode = _grd.Cell(e.Row, e.Col).Text
changeType = RowNodeChangedEventArgs.RowNodeChangeType.ErrorCode
Case ColNames.ErrorMessage
cmd = New GridNodeTextChangedCommand(_grd, e.Row, e.Col, node.ErrorMessage.ToString(), _grd.Cell(e.Row, e.Col).Text)
node.ErrorMessage = _grd.Cell(e.Row, e.Col).Text
changeType = RowNodeChangedEventArgs.RowNodeChangeType.ErrorMessage
End Select
If CommandManager.IsRuning = False AndAlso cmd IsNot Nothing Then
CommandManager.RunCommand(cmd)
RaiseEvent PlanGridCommandChanged(Nothing, Nothing)
End If
OnUserActionEnd(node)
'触发事件
If SkipEvent Then Return
@@ -1236,6 +1271,7 @@ Namespace UTSModule.Station
Dim args As New RowNodeChangedEventArgs With {
.Node = node,
.BeforeNode = beforeNode,
.ChangeType = changeType
}
RaiseEvent RowNodeTextChanged(sender, args)
@@ -1533,8 +1569,10 @@ Namespace UTSModule.Station
Dim startNode As RowNode = _headNode.RowList(startMoveRow - _drawStartRow + 1)
For i As Integer = 1 To rows
node = _headNode.RowList(startMoveRow - _drawStartRow + i)
If node.RowLever > startNode.RowLever Then Continue For
If node.RowLever < startNode.RowLever Then Exit For
If startNode.RowLever <> node.RowLever Then
MsgBox("请选择同一级别节点再尝试此操作") '非同级别节点不移动
Return
End If
nodes.Add(node)
Next
@@ -1599,9 +1637,18 @@ Namespace UTSModule.Station
Dim startNode As RowNode = _headNode.RowList(startMoveRow - _drawStartRow + 1)
Dim prevNode As RowNode = startNode.PrevNode
If prevNode Is Nothing Then Return
Dim node As RowNode
For i As Integer = 2 To moveRows
node = _headNode.RowList(startMoveRow - _drawStartRow + i)
If startNode.RowLever <> node.RowLever Then
MsgBox("请选择同一级别节点再尝试此操作") '非同级别节点不移动
Return
End If
Next
Dim moveEndRow As Integer = prevNode.RowListIndex
Dim cmd As New GridNodeMoveUpCommand(Me, startMoveRow, moveRows, moveEndRow)
CommandManager.RunCommand(cmd) '添加到撤销堆栈执行
@@ -1612,10 +1659,20 @@ Namespace UTSModule.Station
Public Sub NodeMoveDown(startMoveRow As Integer, moveRows As Integer)
If _headNode Is Nothing Then Return
Dim startNode As RowNode = _headNode.RowList(startMoveRow - _drawStartRow + 1)
Dim endNode As RowNode = _headNode.RowList(startMoveRow + moveRows - _drawStartRow)
Dim nextNode As RowNode = endNode.NextNode
If nextNode Is Nothing Then Return
Dim node As RowNode
For i As Integer = 2 To moveRows
node = _headNode.RowList(startMoveRow - _drawStartRow + i)
If startNode.RowLever <> node.RowLever Then
MsgBox("请选择同一级别节点再尝试此操作") '非同级别节点不移动
Return
End If
Next
Dim moveEndRow As Integer = startMoveRow + nextNode.AllChildCount + 1
Dim cmd As New GridNodeMoveDownCommand(Me, startMoveRow, moveRows, moveEndRow)
CommandManager.RunCommand(cmd) '添加到撤销堆栈执行
@@ -1782,8 +1839,10 @@ Namespace UTSModule.Station
Dim moveEndRow As Integer = startNode.ParentNode.RowListIndex + startNode.ParentNode.AllChildCount + 1
For i As Integer = 1 To moveRows
node = _headNode.RowList(startMoveRow - _drawStartRow + i)
If node.RowLever < startNode.RowLever Then Exit For '高于起始节点级别不移动
If node.RowLever > startNode.RowLever Then Continue For
If startNode.RowLever <> node.RowLever Then
MsgBox("请选择同一级别节点再尝试此操作") '非同级别节点不移动
Return
End If
moveEndRow -= (node.AllChildCount + 1)
Next
@@ -1840,6 +1899,15 @@ Namespace UTSModule.Station
If startNode.RowLever < 1 Then Return '固定节点不移动
If startNode.PrevNode Is Nothing Then Return '没有上一级节点
Dim node As RowNode
For i As Integer = 2 To moveRows
node = _headNode.RowList(startMoveRow - _drawStartRow + i)
If startNode.RowLever <> node.RowLever Then
MsgBox("请选择同一级别节点再尝试此操作") '非同级别节点不移动
Return
End If
Next
Dim moveRightNodeIndex As Integer = startNode.PrevNode.Children.Count
Dim moveEndRow As Integer = startNode.PrevNode.RowListIndex + startNode.PrevNode.AllChildCount + 1
@@ -1900,53 +1968,25 @@ Namespace UTSModule.Station
With _grd
Select Case e.ChangeType
Case RowNodeChangedEventArgs.RowNodeChangeType.Action
cmd = New GridNodeTextChangedCommand(_grd, row, ColNames.Action, .Cell(row, ColNames.Action).Text, node.Action.ToString())
.Cell(row, ColNames.Action).Text = IIf(node.Action, "1", "0").ToString()
NodeActionChanged(node)
Case RowNodeChangedEventArgs.RowNodeChangeType.RowType
'If node.RowType = RowNode.RowTypeEnum.FixedModule Then
' .Cell(row, ColNames.Label).FontSize = 10
' .Cell(row, ColNames.Label).FontBold = True
'ElseIf node.RowType = RowNode.RowTypeEnum.Module Then
' .Cell(row, ColNames.Label).FontSize = 8
' .Cell(row, ColNames.Label).FontBold = True
'ElseIf node.RowType = RowNode.RowTypeEnum.Flow Then
' .Cell(row, ColNames.Label).FontSize = 8
' .Cell(row, ColNames.Label).FontBold = False
'End If
'NodeActionChanged(node)
NodeRowTypeChanged(node)
Case RowNodeChangedEventArgs.RowNodeChangeType.Label
cmd = New GridNodeTextChangedCommand(_grd, row, ColNames.Label, .Cell(row, ColNames.Label).Text, node.Label.ToString())
.Cell(row, ColNames.Label).Text = $"{node.Label}"
Case RowNodeChangedEventArgs.RowNodeChangeType.ControlType
cmd = New GridNodeTextChangedCommand(_grd, row, ColNames.ControlType, .Cell(row, ColNames.ControlType).Text, node.ControlType.ToString())
.Cell(row, ColNames.ControlType).Text = $"{node.ControlType}"
Case RowNodeChangedEventArgs.RowNodeChangeType.Description
cmd = New GridNodeTextChangedCommand(_grd, row, ColNames.Description, .Cell(row, ColNames.Description).Text, node.Description.ToString())
.Cell(row, ColNames.Description).Text = $"{node.Description}"
Case RowNodeChangedEventArgs.RowNodeChangeType.SaveToDb
cmd = New GridNodeTextChangedCommand(_grd, row, ColNames.SaveToDb, .Cell(row, ColNames.SaveToDb).Text, node.SaveToDb.ToString())
.Cell(row, ColNames.SaveToDb).Text = IIf(node.SaveToDb, "1", "0").ToString()
Case RowNodeChangedEventArgs.RowNodeChangeType.RecordName
cmd = New GridNodeTextChangedCommand(_grd, row, ColNames.RecordName, .Cell(row, ColNames.RecordName).Text, node.RecordName.ToString())
.Cell(row, ColNames.RecordName).Text = $"{node.RecordName}"
Case RowNodeChangedEventArgs.RowNodeChangeType.Retry
cmd = New GridNodeTextChangedCommand(_grd, row, ColNames.Retry, .Cell(row, ColNames.Retry).Text, node.Retry.ToString())
.Cell(row, ColNames.Retry).Text = $"{node.Retry}"
Case RowNodeChangedEventArgs.RowNodeChangeType.RetryInterval
cmd = New GridNodeTextChangedCommand(_grd, row, ColNames.RetryInterval, .Cell(row, ColNames.RetryInterval).Text, node.RetryInterval.ToString())
.Cell(row, ColNames.RetryInterval).Text = $"{node.RetryInterval}"
Case RowNodeChangedEventArgs.RowNodeChangeType.ErrorCode
cmd = New GridNodeTextChangedCommand(_grd, row, ColNames.ErrorCode, .Cell(row, ColNames.ErrorCode).Text, node.ErrorCode.ToString())
.Cell(row, ColNames.ErrorCode).Text = $"{node.ErrorCode}"
If String.IsNullOrWhiteSpace(node.ErrorCode) = False Then
.Cell(row, ColNames.ErrorCode).BackColor = _errCodeManager(node.ErrorCode).Color
@@ -1956,35 +1996,34 @@ Namespace UTSModule.Station
.Cell(row, ColNames.ErrorMessage).BackColor = Color.White
End If
Case RowNodeChangedEventArgs.RowNodeChangeType.ErrorMessage
cmd = New GridNodeTextChangedCommand(_grd, row, ColNames.ErrorMessage, .Cell(row, ColNames.ErrorMessage).Text, node.ErrorMessage.ToString())
.Cell(row, ColNames.ErrorMessage).Text = $"{node.ErrorMessage}"
Case RowNodeChangedEventArgs.RowNodeChangeType.CommandType
If String.Compare(.Cell(row, ColNames.CommandType).Text, node.CommandType) <> 0 Then
cmd = New GridNodeTextChangedCommand(_grd, row, ColNames.CommandType, .Cell(row, ColNames.CommandType).Text, node.CommandType.ToString())
.Cell(row, ColNames.CommandType).Text = $"{node.CommandType}"
CommandTypeChanged(node)
NodeActionChanged(node)
End If
Case RowNodeChangedEventArgs.RowNodeChangeType.Command
If String.Compare(.Cell(row, ColNames.Command).Text, node.Command) <> 0 Then
cmd = New GridNodeTextChangedCommand(_grd, row, ColNames.Command, .Cell(row, ColNames.Command).Text, node.Command.ToString())
.Cell(row, ColNames.Command).Text = $"{node.Command}"
CommandChanged(node)
NodeActionChanged(node)
End If
Case RowNodeChangedEventArgs.RowNodeChangeType.Parameters
cmd = New GridNodeTextChangedCommand(_grd, row, ColNames.Parameters, .Cell(row, ColNames.Parameters).Text, ParamsToString(node.Parameters))
.Cell(row, ColNames.Parameters).Text = $"{ParamsToString(node.Parameters)}"
End Select
End With
OnUserAction(e.BeforeNode)
OnUserActionEnd(e.Node)
'If CommandManager.IsRuning = False Then
If CommandManager.IsRuning = False AndAlso cmd IsNot Nothing Then
CommandManager.RunCommand(cmd)
RaiseEvent PlanGridCommandChanged(Nothing, Nothing)
End If
' Dim dic As New Dictionary(Of Integer, TextChangedRowNode) From {
' {row, New TextChangedRowNode With {.BeforeRowNode = e.BeforeNode.Clone, .AfterRowNode = e.Node.Clone}}
' }
' CommandManager.AddUndoCommand(New GridNodeTextChangedCommand(Me, dic))
' RaiseEvent PlanGridCommandChanged(Nothing, Nothing)
'End If
StationEditStatusMonitor.StationEditStatus = StationEditStatusMonitor.StationEditStatusEnum.Changed