Прежде всего, это мой самый первый вопрос в этом сообществе. Пожалуйста, дайте мне совет, если я сделал это неправильно.
Мне нужна помощь. На самом деле я работаю над библиотекой классов 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, но это также не сработало.