小而成熟的虚拟模式应用实例,供以后再次使用参考
Imports DevComponents.DotNetBar.Controls
Public Class UCEntityOuterExtend
Implements IUCRun
Private _ExtendList As EventList(Of OuterExtendItem)
Public Sub setObject(ByVal pObject As EventList(Of OuterExtendItem))
If (_ExtendList IsNot Nothing) Then
disposeMe()
End If
_ExtendList = pObject
If (mLoaded) Then
run()
End If
End Sub
Public Property mLoaded As Boolean Implements ILoadable.mLoaded
Public Sub bindEvent() Implements IRunControl.bindEvent
If (_ExtendList IsNot Nothing) Then
AddHandler _ExtendList.eChanged, AddressOf listChanged
End If
AddHandler MyHub.mBase.mGlobalEvent.eUserRightChange, AddressOf UserRightChanged
End Sub
Private Sub listChanged(sender As Object, ByVal e As DBListChangedEventArgs(Of OuterExtendItem))
If (Me.InvokeRequired) Then
Me.BeginInvoke(New EventHandler(Of DBListChangedEventArgs(Of OuterExtendItem))(AddressOf listChanged), New Object() {sender, e})
Else
xDataGridView.RowCount = _ExtendList.Count + 1
xDataGridView.Refresh()
End If
End Sub
Public Sub breakEvent() Implements IRunControl.breakEvent
If (_ExtendList IsNot Nothing) Then
RemoveHandler _ExtendList.eChanged, AddressOf listChanged
End If
If (MyHub.mBase.mGlobalEvent IsNot Nothing) Then
AddHandler MyHub.mBase.mGlobalEvent.eUserRightChange, AddressOf UserRightChanged
End If
End Sub
Public Sub disposeMe() Implements IRunControl.disposeMe
If (Me.DesignMode) Then
Return
End If
breakEvent()
End Sub
Public Property mHalt As Boolean Implements IRunControl.mHalt
Public Sub run() Implements IRunControl.run
If (Me.DesignMode) Then
Return
End If
listChanged(Me, Nothing)
UserRightChanged(Me, EventArgs.Empty)
bindEvent()
mLoaded = True
End Sub
Private Sub UCEntityOuterExtend_Disposed(sender As Object, e As System.EventArgs) Handles Me.Disposed
disposeMe()
End Sub
Private Sub UCEntityOuterExtend_Load(sender As Object, e As System.EventArgs) Handles Me.Load
run()
mLoaded = True
End Sub
Private Sub xDataGridView_CellBeginEdit(sender As Object, e As System.Windows.Forms.DataGridViewCellCancelEventArgs) Handles xDataGridView.CellBeginEdit
If (mHalt) Then
e.Cancel = True
Return
End If
If (Not MyHub.mBase.user.IsLogin()) Then
e.Cancel = True
Return
End If
End Sub
Private Sub xDataGridView_CellValueNeeded(sender As Object, e As System.Windows.Forms.DataGridViewCellValueEventArgs) Handles xDataGridView.CellValueNeeded
If (mHalt) Then
Return
End If
If (e.RowIndex < 0 OrElse e.RowIndex > _ExtendList.Count) Then
Return
End If
If (e.RowIndex = _ExtendList.Count) Then
If (pInitData Is Nothing) Then
pInitData = New XXXXXXXXX()
End If
Select Case e.ColumnIndex
Case xColumnTitle.Index
e.Value = pInitData.mTitle
Case xColumnValue.Index
e.Value = pInitData.mValue
End Select
Else
With _ExtendList
Select Case e.ColumnIndex
Case xColumnTitle.Index
e.Value = .Item(e.RowIndex).mTitle
Case xColumnValue.Index
e.Value = .Item(e.RowIndex).mValue
Case xColumnDele.Index
e.Value = xColumnDele.HeaderText
End Select
End With
End If
End Sub
'如果需要检查数据,则可以加入CellValidating和CellValidated来判断控件
Private Sub xDataGridView_CellValidating(sender As Object, e As DataGridViewCellValidatingEventArgs) Handles xDataGridView.CellValidating
If (e.RowIndex >= xDataGridView.Rows.Count - 1) Then '新行不检查
Return
End If
If (e.ColumnIndex = xColumnLevel.Index) Then
Dim pLevel As Integer = CInt(e.FormattedValue)
For i As Integer = 0 To _ActiveLPModuleList.Count - 1
If (i <> e.RowIndex) Then
If (pLevel = _ActiveLPModuleList(i).mLevel) Then
e.Cancel = True
showMessage("液位不能重复,请重新修改液位值", EMMessageStatus.fail)
Return
End If
End If
Next
End If
End Sub
Private Sub xDataGridView_CellValidated(sender As Object, e As DataGridViewCellEventArgs) Handles xDataGridView.CellValidated
_LastMsgStatus = EMMessageStatus.common
clearMessageIfNoStatus() '为了清空
End Sub
Private Sub xDataGridView_CellValuePushed(sender As Object, e As System.Windows.Forms.DataGridViewCellValueEventArgs) Handles xDataGridView.CellValuePushed
If (mHalt) Then
Return
End If
If (e.RowIndex < 0 OrElse e.RowIndex >= _ExtendList.Count) Then
Return
End If
Dim pValue As String = e.Value
If (Not String.IsNullOrEmpty(pValue)) Then
If (pValue.Length > 100) Then
pValue = pValue.Substring(0, 100)
End If
End If
With _ExtendList(e.RowIndex)
Try
Select Case e.ColumnIndex
Case xColumnTitle.Index
.mTitle = pValue
Case xColumnValue.Index
.mValue = pValue
End Select
.raiseValueChangedEvent(_ExtendList, EventArgs.Empty)
Catch exp As Exception
MyHub.mBase.mDebugLog.writerError(Me, exp)
Finally
End Try
End With
End Sub
Private pInitData As OuterExtendItem
'此事件的主要作用就是生一个临时数据对像用来呈现新行的数据,但此时不能添加到数据表中
Private Sub xDataGridView_NewRowNeeded(sender As Object, e As System.Windows.Forms.DataGridViewRowEventArgs) Handles xDataGridView.NewRowNeeded
If (mHalt) Then
Return
End If
pInitData = New OuterExtendItem()
pInitData.mTitle = ""
pInitData.mValue = ""
End Sub
Private Sub xDataGridView_UserDeletingRow(sender As Object, e As System.Windows.Forms.DataGridViewRowCancelEventArgs) Handles xDataGridView.UserDeletingRow
If (e.Row.IsNewRow OrElse MyHub.mBase.user.IsLogin = False) Then
e.Cancel = True
Return
End If
Dim pQuistion As String = "确定要删除字段" & e.Row.Cells(xColumnTitle.Index).Value & "吗?"
If (MsgBox(pQuistion, MsgBoxStyle.YesNo, MyHub.mBase.appTitle) = MsgBoxResult.No) Then
e.Cancel = True
Else
If (e.Row.Index >= 0 AndAlso e.Row.Index < _ExtendList.Count) Then
e.Cancel = True '如果不阻止表格自身的删除,则会显示为清除2行
_ExtendList.RemoveAt(e.Row.Index)
End If
End If
End Sub
Private Sub xDataGridView_CellClick(sender As System.Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles xDataGridView.CellClick
If (xDataGridView.Rows(e.RowIndex).IsNewRow) Then
Return
End If
If (e.ColumnIndex = xColumnDele.Index AndAlso MyHub.mBase.user.IsLogin) Then
If (e.RowIndex >= 0 AndAlso e.RowIndex < _ExtendList.Count) Then
Dim pQuistion As String = "确定要删除字段" & xDataGridView.Rows(e.RowIndex).Cells(xColumnTitle.Index).Value & "吗?"
If (MsgBox(pQuistion, MsgBoxStyle.YesNo, MyHub.mBase.appTitle) = MsgBoxResult.Yes) Then
_ExtendList.RemoveAt(e.RowIndex)
End If
End If
End If
End Sub
'Private Sub xDataGridView_UserDeletedRow(sender As Object, e As System.Windows.Forms.DataGridViewRowEventArgs) Handles xDataGridView.UserDeletedRow
' If (e.Row Is Nothing) Then
' Return
' End If
' Dim pTitle As String = Convert.ToString(e.Row.Cells(xColumnTitle.Index).Value)
' Dim pItem As OuterExtendItem = _ExtendList.Find(Function(p) p.mTitle = pTitle)
' If (pItem IsNot Nothing) Then
' _ExtendList.Remove(pItem)
' End If
'End Sub
Private Sub xDataGridView_UserAddedRow(sender As Object, e As System.Windows.Forms.DataGridViewRowEventArgs) Handles xDataGridView.UserAddedRow
If (mHalt) Then
Return
End If
If (_ExtendList Is Nothing) Then
Return
End If
If (_ExtendList.Count > 40) Then '最多40条数据,40条数据后,不再接受新的记录
Return
End If
If (pInitData IsNot Nothing) Then
_ExtendList.addNotEvent(pInitData)
pInitData = Nothing
End If
showDeleteButton(e.Row)
End Sub
Private Sub UserRightChanged(sender As Object, e As EventArgs)
If (Me.InvokeRequired) Then
Me.BeginInvoke(New EventHandler(AddressOf UserRightChanged), New Object() {sender, e})
Else
'xDataGridView.Enabled = MyHub.mBase.user.IsLogin()
For Each pRow As DataGridViewRow In xDataGridView.Rows
showDeleteButton(pRow)
Next
End If
End Sub
Private Sub showDeleteButton(ByVal pRow As DataGridViewRow)
Dim pX As DataGridViewLinkCell = CType(pRow.Cells(xColumnDele.Index), DataGridViewLinkCell)
If (MyHub.mBase.user.IsLogin()) Then
pX.Style.ForeColor = Color.SkyBlue
pX.Style.BackColor = Color.White
pX.LinkColor = Color.SkyBlue
Else
pX.Style.ForeColor = Color.Silver
pX.Style.BackColor = Color.Gray
pX.LinkColor = Color.Silver
End If
End Sub
Private Sub xDataGridView_DataError(sender As Object, e As System.Windows.Forms.DataGridViewDataErrorEventArgs) Handles xDataGridView.DataError
If (e.Exception IsNot Nothing) Then
MyHub.mBase.mDebugLog.writerError(Me, e.Exception)
e.ThrowException = True
e.Cancel = True
End If
End Sub
End Class