Ralf Meier Ответов: 0

Проблема с collectioneditor


У меня есть индивидуальная коллекция, которая иногда используется во время разработки.
Кутомизированные классы, которые я хочу добавить (а также удалить) в классы, имеют события, которые должны быть собраны в моей коллекции, а также переданы за пределы этой коллекции.

Если я работаю с частью времени выполнения, все работает так, как я хочу, потому что мои методы Add - и Remove-могут добавлять и удалять обработчики.

Во время разработки я предполагал, что метод OnInsertComplete вызывается при нажатии кнопки Add-редактора - это работает косвенно.
Также я предположил, что метод OnRemove или OnRemoveComplete вызывается при нажатии кнопки Remove редактора-но этого никогда не происходит.

Поэтому я подумал о обходе, который ловит метод-делегат события Click-кнопки Remove, удаляет этот делегат из кнопки и заменяет его моим собственным методом, который вызывает OnRemove в коллекции, вызывает сохраненный делегат и после этого вызывает OnRemoveComplete коллекции.

И вот тут-то я и застрял.
Я могу получить Eventinfo из кнопки, я могу сделать MethodInfo ... но я не могу получить от него делегата.

Что я уже пробовал:

Public Class RMCollectionEditor
    Inherits CollectionEditor

    Public Sub New(ByVal type As System.Type)
        MyBase.New(type)
    End Sub

    Protected Overrides Function CreateCollectionForm() As CollectionEditor.CollectionForm
        Dim cForm As CollectionForm = MyBase.CreateCollectionForm()

        Dim myButton() As Control

         ' Remove-Button
        myButton = cForm.Controls.Find("removeButton", True)
        If myButton.Length > 0 Then
  
            Dim myEventInfo As System.Reflection.EventInfo = GetType(Button).GetEvent("Click", Reflection.BindingFlags.NonPublic Or BindingFlags.Public Or Reflection.BindingFlags.Instance)

            Dim myInfo As System.Reflection.MethodInfo = myEventInfo.GetAddMethod(True)
            RepeatDelegate = [Delegate].CreateDelegate(GetType(delegate_OnClick), myInfo, False)
            RemoveHandler myButton(0).Click, [Delegate].CreateDelegate(GetType(delegate_OnClick), myInfo, False)
            AddHandler myButton(0).Click, AddressOf RemoveButton_Handler

        End If

         Return cForm
    End Function


     Private Sub RemoveButton_Handler(sender As Object, e As EventArgs)
        MessageBox.Show("Remove")
     End Sub

End Class



Было бы здорово, если бы кто-нибудь помог мне сделать следующий шаг ...

Kornfeld Eliyahu Peter

Может быть, речь идет о том, как выглядит ваша коллекция? Можете ли вы показать код для этого?

Ralf Meier

Я мог бы... но я думаю, что в этом нет особой необходимости.
Это коллекция, которая происходит от CollectionBase. Дело в том, когда On-методы вызываются или не вызываются ...

Kornfeld Eliyahu Peter

Он также может работать, чтобы переопределить метод CollectionEditor DestroyInstance...

Ralf Meier

Нет... дело в поведении во время разработки. Здесь я обычно удаляю только один или два вставленных класса ...
Я должен знать (для следующей части программы), какой класс-объект удален, а не то, что один (или несколько) класс - объект удален.

0x01AA

Может быть, я не понимаю смысла, но я бы согласился с Питером переопределить DestroyInstance и зарегистрировать удаленные объекты.

Ralf Meier

пожалуйста, посмотрите, что я написал Питерсу в комментарии ...

Ralf Meier

Может быть, я не понимаю, к чему ты клонишь ...
В данный момент CollectionEditor работает следующим образом (если я использую его для редактирования коллекции) :
- если я добавляю новый объект класса, он вызывает (Я полагаю, косвенный) метод OnInsert - и метод OnInsertComplete-
- если я удаляю объект класса и закрываю редактор, он полностью очищает коллекцию и вызывает метод OnClear. После этого он снова вставляет оставшиеся объекты.

Для меня это поведение неоптимально (но, конечно, оно работает). Что я могу сделать сейчас, так это жить с этим, следовать этому поведению и выполнять соответствующие действия внутри и вне коллекции (вырезать каждое событие из каждого объекта, удалить каждый объект, добавить каждый объект снова и соединить каждое событие с каждым объектом) ... или попытаться изменить его ...
В данный момент я не знаю, смогу ли добиться успеха ... но в данный момент не время сдаваться ... ;)

Я думаю, что с DestroyInstance-методом происходит то же самое, но я не уверен ... так что, может быть, вы мне объясните ?..

Kornfeld Eliyahu Peter

У меня не было какого-то конкретного решения для вас, это была идея самой...
Честно говоря, я не очень понимаю, что вы ищете, поэтому мне, наверное, не очень нужна помощь...

Ralf Meier

Я думал, что это объяснено ... :(
Я хочу знать (из CollectionEditor), какой объект удаляется во время разработки. К сожалению, эта информация не будет предоставлена этим редактором.
Но порывшись в Интернете, я обнаружил, что не только у меня есть эта проблема. Так... если у меня есть решение, я предоставлю его здесь ...

0 Ответов