Проблема с 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), какой объект удаляется во время разработки. К сожалению, эта информация не будет предоставлена этим редактором.
Но порывшись в Интернете, я обнаружил, что не только у меня есть эта проблема. Так... если у меня есть решение, я предоставлю его здесь ...