小而成熟的虚拟模式应用实例,供以后再次使用参考

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