Не выполняется два события объекта - PullRequest
0 голосов
/ 25 апреля 2020

С Днем всех, я должен был бы решить проблему не выполнения двух событий объекта. Я реконструировал следующий класс:

 Imports System.Data.SqlClient
 Imports System.Data.OleDb

 Public Class FunDeletedLocalData

       Public Event ProgressDeleted(ByVal value As Integer)
       Public Event MaxProgressDeleted(value As Integer)

      Shared DataStartAppList As List(Of DataStartAppCS)
      Shared DataEndAppList As List(Of DataEndAppCS)


      Public Sub DeleteAllDataApp()
          Dim i As Integer = 0
          '**** Preparo lista Record StartApp
          'DataStartAppList = New List(Of DataStartAppCS)

          ReadDataStartAppFromDBLocaleForDelete()

          RaiseEvent MaxProgressDeleted(DataStartAppList.Count)


          For Each item As DataStartAppCS In DataStartAppList
              Try
                DataStartAppDB.DeleteDataStart(item.IdStartApp)
              Catch ex As Exception
                    MessageBox.Show("error transfer data to Server: " & ex.ToString, "Errore", 
                                   MessageBoxButtons.OK, MessageBoxIcon.Error)
                    Exit Sub
              End Try
              i += 1
              RaiseEvent ProgressDeleted(i)
           Next

          '**** Preparo lista Record EndApp

          DataEndAppList = New List(Of DataEndAppCS)

          ReadDataEndAppFromDBLocaleForDelete()

          RaiseEvent MaxProgressDeleted(i + DataEndAppList.Count)

          For Each item As DataEndAppCS In DataEndAppList
            Try
                 DataEndAppDB.DeleteDataEnd(item.IdEndApp)
            Catch ex As Exception
               MessageBox.Show("error transfer data to Server: " & ex.ToString, "Errore", 
                       MessageBoxButtons.OK, MessageBoxIcon.Error)
               Exit Sub
            End Try
            i += 1
            RaiseEvent ProgressDeleted(i)
         Next
   End Sub

   Public Sub DeleteOnlyDataStartApp()
      DataStartAppList = New List(Of DataStartAppCS)

      ReadDataStartAppFromDBLocaleForDelete()

      RaiseEvent MaxProgressDeleted(DataStartAppList.Count)

      Dim i As Integer = 0
      For Each item As DataStartAppCS In DataStartAppList
        Try
           DataStartAppDB.DeleteDataStart(item.IdStartApp)
        Catch ex As Exception
           MessageBox.Show("error transfer data to Server: " & ex.ToString, "Errore", 
                   MessageBoxButtons.OK, MessageBoxIcon.Error)
           Exit Sub
        End Try
        i += 1
        RaiseEvent ProgressDeleted(i)
      Next
  End Sub

 Sub DeleteOnlyDataEndApp()
    DataEndAppList = New List(Of DataEndAppCS)

    ReadDataEndAppFromDBLocaleForDelete()

    RaiseEvent MaxProgressDeleted(DataEndAppList.Count)

    Dim i As Integer = 0
    For Each item As DataEndAppCS In DataEndAppList
     Try
        DataEndAppDB.DeleteDataEnd(item.IdEndApp)
     Catch ex As Exception
        MessageBox.Show("error transfer data to Server: " & ex.ToString, "Errore", 
                     MessageBoxButtons.OK, MessageBoxIcon.Error)
        Exit Sub
     End Try
     i += 1
     RaiseEvent ProgressDeleted(i)
   Next
End Sub

#Region "ReadDataFromDBLocaleForDelete"

 Public Shared Function ReadDataStartAppFromDBLocaleForDelete() As Boolean
    Dim stReturn As Boolean = True
    Try
       DataStartAppList = DataStartAppDB.GetDataStartListForDelete
    Catch ex As SqlException
       stReturn = False
       Throw ex
    End Try
    Return stReturn
 End Function

 Public Shared Function ReadDataEndAppFromDBLocaleForDelete() As Boolean
    Dim stReturn As Boolean = True
    Try
       DataEndAppList = DataEndAppDB.GetDataEndListForDelete
    Catch ex As SqlException
      stReturn = False
      Throw ex
   End Try
   Return stReturn
 End Function
#End Region

 Sub New()
 End Sub
End Class

, который удаляет записи в ссылочной базе данных, которые я передаю в списке, потому что они удовлетворяют определенным условиям. В форме, где создается соответствующий объект FD и закрепляется его события, эти основные подпрограммы включают в себя:

Private WithEvents FD As FunDeletedLocalData

Private Sub btnAccept_Click(sender As Object, e As EventArgs) Handles btnAccept.Click
  btnClose.Enabled = False
  btnAccept.Enabled = False
  Me.lblRecDeleted.Visible = True
  Me.prgBar.Visible = True
  Me.Refresh()
  Dim FD = New FunDeletedLocalData
  If rdTDAll.Checked Then
     FD.DeleteAllDataApp()
  ElseIf rdStartApp.Checked Then
     FD.DeleteOnlyDataStartApp()
  ElseIf rdEndApp.Checked Then
     FD.DeleteOnlyDataEndApp()
  End If
  FD = Nothing
  btnAccept.Enabled = True
  btnClose.Enabled = True
  Me.prgBar.Visible = False
End Sub

Private Sub FD_ProgressDeleted(value As Integer) Handles FD.ProgressDeleted

  Me.prgBar.Maximum = value

End Sub

Private Sub FD_MaxProgressDeleted(value As Integer) Handles FD.MaxProgressDeleted

  Me.lblRecDeleted.Text = "Record Cancellati: " & value.ToString
  Me.prgBar.PerformStep()
  Me.Refresh()

End Sub

Все работает правильно, и записи фактически удаляются, и у меня нет ошибок. Единственное, что не работает - это события объекта:

RaiseEvent MaxProgressDeleted(DataEndAppList.Count)
RaiseEvent ProgressDeleted(i)

Они не выбрасываются. Как так? В очень похожем классе я бы сказал, что идентичным в том смысле, что оно точно равно единственному различию, является вызов:

DataEndAppDB.DeleteDataEnd(item.IdEndApp)

, поскольку для удаления записи нужен только iD, тогда как в другом классе они принадлежат Тип:

DataEndAppSQLDB.AddEndApp(item)

Не могли бы вы сказать мне, где проблема? Спасибо всем.

Ответы [ 2 ]

0 голосов
/ 26 апреля 2020

Переменная FD в вас Form объявляется на уровне формы с

Private WithEvents FD As FunDeletedLocalData

Другая переменная на уровне метода объявляется и создается с

Dim FD = New FunDeletedLocalData

, за исключением на этот раз он не объявлен WithEvents.

Ниже приведена минимальная полная возможность воспроизведения с акцентом на минимальную переработку вашего кода. Просто удалите Dim для второй переменной в методе.

Public Class Form2
    Private WithEvents FD As FunDeletedLocalData
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        FD = New FunDeletedLocalData
        FD.DeleteAllDataApp()
        FD.DeleteOnlyDataStartApp()
        FD.DeleteOnlyDataEndApp()
        FD = Nothing
    End Sub

    Private Sub FD_ProgressDeleted(value As Integer) Handles FD.ProgressDeleted
        MessageBox.Show("Progress Event fired")
    End Sub

    Private Sub FD_MaxProgressDeleted(value As Integer) Handles FD.MaxProgressDeleted
        MessageBox.Show("Max Progress Event fired")
    End Sub

End Class

Public Class FunDeletedLocalData

    Public Event ProgressDeleted(ByVal value As Integer)
    Public Event MaxProgressDeleted(value As Integer)

    Public Sub DeleteAllDataApp()
        RaiseEvent ProgressDeleted(5)
        RaiseEvent MaxProgressDeleted(6)
    End Sub

    Public Sub DeleteOnlyDataStartApp()
        RaiseEvent MaxProgressDeleted(7)
        RaiseEvent ProgressDeleted(8)
    End Sub

    Sub DeleteOnlyDataEndApp()
        RaiseEvent MaxProgressDeleted(9)
        RaiseEvent ProgressDeleted(10)
    End Sub

End Class
0 голосов
/ 25 апреля 2020

Что случилось с этим:

Dim FD = New FunDeletedLocalData

Почему вы объявляете локальную переменную в btnAccept_Click вместо того, чтобы использовать объявленное вами поле WithEvents? Каждая ссылка на FD в этом методе ссылается на локальную переменную, а не на поле. Насколько я могу судить, вы никогда ничего не назначаете для поля, так что бы вы обработали события?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...