Унаследованное событие класса не сработало - PullRequest
0 голосов
/ 15 сентября 2018

Прежде всего, это мой самый первый вопрос в этом сообществе. Пожалуйста, дайте мне совет, если я сделал это неправильно.

Мне нужна помощь. На самом деле я работаю над библиотекой классов BMEcat, BMEcat - это формат обмена данными для электронных каталогов. Все работает нормально, но я понял, что есть проблема с памятью при обработке очень больших файлов. Из-за этого я хочу отправить событие для любой обработанной статьи / продукта вместо создания огромной структуры в памяти. Именно здесь начинается моя проблема.

У меня есть класс CTRANSACTION, из которого получены классы CT_NEW_CATALOG, CT_UPDATE_PRODUCTS и CT_UPDATE_PRICES.

В базовом классе CTRANSACTION определено событие:

Public Event Transaction_OnNewArticle(ByVal sender As Object, ByVal e As ArticleEventArgs)

Класс CBMECAT имеет переменную

Public WithEvents TRANSACTION As CTRANSACTION

и обработчик события

Private Sub TRANSACTION_Transaction_OnNewArticle(sender As Object, e As ArticleEventArgs) Handles TRANSACTION.Transaction_OnNewArticle
    '...
End Sub

Поскольку я не могу отправить событие Transaction_OnNewArticle из производного класса CT_NEW_CATALOG, я позволил ему вместо этого вызвать метод TransactionEventOnNewArticle, который определен в CTRANSACTION. TransactionEventOnNewArticle затем звонит RaiseEvent Transaction_OnNewArticle.

Все прекрасно работает, но событие Transaction_OnNewArticle не запускается. Есть ли способ это исправить?

Public MustInherit Class CTRANSACTION
    Inherits CBMECAT_NODE
    Public Event Transaction_OnNewArticle(ByVal sender As Object, ByVal e As ArticleEventArgs)
    Public Sub TransactionEventOnNewArticle(ByVal sender As Object,   ByVal e As ArticleEventArgs)
        RaiseEvent Transaction_OnNewArticle(sender, e)
    End Sub

Public Class CT_NEW_CATALOG
    Inherits CTRANSACTION

    Public Overrides Sub EventOnNewArticle(ByVal sender As Object, ByVal e As ArticleEventArgs)
        TransactionEventOnNewArticle(sender, e)
    End Sub

Public Class CBMECAT
    Inherits CBMECAT_NODE
    Public WithEvents TRANSACTION As CTRANSACTION  

    Private Sub TRANSACTION_Transaction_OnNewArticle(sender As Object, e As ArticleEventArgs) Handles TRANSACTION.Transaction_OnNewArticle
        'THIS method is never called - why?
    End Sub
End Class

UPDATE

Public Class CBMECAT_ELEMENT 
    Public Overridable Sub EventOnNewArticle(ByVal sender As Object, ByVal e As ArticleEventArgs)
    End Sub 

'Please notice that CBMECAT_ELEMENT is the base class of EVERY other class in the library. 
'There is a class CBMECAT_NODE, which represents every node of the BMEcat XML structure and is derived from CBMECAT_ELEMENT. 
'In CBMECAT_NODE is EventOnNewArticle called whenever an article is processed;

Public Class CBMECAT_NODE
    Inherits CBMECAT_ELEMENT

    Public Overridable Function CreateChildNode(ByRef Nodename As String, Optional ByRef Parent As CBMECAT_NODE = Nothing) As CBMECAT_ELEMENT 
        Select Case Nodename
            [..] 
            Case ELEMENT_ARTICLE 
                CreateChildNode = New CARTICLE(Parent) 
                Dim e As New ArticleEventArgs With 
                { 
                    .ARTICLE = CreateChildNode 
                } 
                EventOnNewArticle(Me, e) 
                [..] 

UPDATE

Public Class CARTICLE
    Inherits CBMECAT_NODE
    Public Sub New(ByRef Father As CBMECAT_NODE)
    [..] 
    Public Overrides Sub Read()
    [..] 
    Public Overrides Sub Write()
    [..] 
    Public Overrides Sub Validate()
    [..] 

UPDATE

Последовательность вызова:

CBMECAT_NODE.CreateChildNode вызывает CT_NEW_CATALOG.EventOnNewArticle <- OK </p>

CT_NEW_CATALOG.EventOnNewArticle вызывает CTRANSACTION.TransactionEventOnNewArticle <- OK </p>

CTRANSACTION.TransactionEventOnNewArticle запускает событие Transaction_OnNewArticle но это событие не получено обработчиком события в CBMECAT

Если я запускаю событие вручную из метода в CTRANSACTION, событие получено обработчиком события.

Я также экспериментировал с AddHandler / RemoveHandler, но это также не сработало.

1 Ответ

0 голосов
/ 16 сентября 2018

Спасибо, Visual Vincent, за то, что помог мне сфокусировать проблему и решить ее. На деле это было "немного" сложно.

Класс CBMECAT имел следующий метод чтения:

Public Overrides Sub Read()
    MyBase.Read()
    GetContent(HEADER, ELEMENT_HEADER)
    Select Case TransactionType
        Case TransactionTypes.T_NEW_CATALOG
            GetContent(TRANSACTION, ELEMENT_T_NEW_CATALOG)
        Case TransactionTypes.T_UPDATE_PRICES
            GetContent(TRANSACTION, ELEMENT_T_UPDATE_PRICES)
        Case TransactionTypes.T_UPDATE_PRODUCTS
            GetContent(TRANSACTION, ELEMENT_T_UPDATE_PRODUCTS)
        Case Else
            ReportError(ERROR_BMECAT_UNKNOWN_TRANSACTION_TYPE)
    End Select
    Validate()
End Sub

MyBase.Read читает полный XML-файл, и во время чтения события должны запускаться. Но в этот момент переменная TRANSACTION не присваивается своим значением. Это делается путем вызова GetContent после завершения процесса чтения.

Я изменился на:

TRANSACTION = New CT_NEW_CATALOG
TRANSACTION.Read()

Теперь все события запускаются, как и ожидалось. Я удалю TransactionEventOnNewArticle () из CBMECAT_ELEMENT . Еще раз спасибо, Винсент, за ваше предложение. : -)

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