|
Хендлер вызывается много раз
|
|||
---|---|---|---|
#18+
Смысл вот в чем: Динамически создается несколько кнопок. На каждую вешается хендлер. Если например разместили 2 кнопки - 2 раза вызовется. 3 - 3 раза и тд. Не могу понять - в чем же дело? Имена у кнопок разные - остальное 1:1 вот код: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2015, 08:43 |
|
Хендлер вызывается много раз
|
|||
---|---|---|---|
#18+
ughunter, возможно делегат в классе, имеет 1 единственный экземпляр для всех 3 кнопок ... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2015, 10:24 |
|
Хендлер вызывается много раз
|
|||
---|---|---|---|
#18+
Попробуйте так: Код: c# 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2015, 11:26 |
|
Хендлер вызывается много раз
|
|||
---|---|---|---|
#18+
похоже это как-то связано с тем, что передается (создается) не новый объект - а ссылка. отсюда вопрос: Код: c# 1.
далее Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38.
после закрытия формы попадаем на эксепшен. доступ к уничтоженному объекту ... Как (выделено оранжевый) передать не ссылку на объект - а создать новый ? Никак понять не могу. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2015, 22:04 |
|
Хендлер вызывается много раз
|
|||
---|---|---|---|
#18+
Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Этот кусочек в хэндлере нажатия на кнопку основной формы. Уточнение: при первом нажатии - все ок - при повторном - эксепшен ... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2015, 22:06 |
|
Хендлер вызывается много раз
|
|||
---|---|---|---|
#18+
ughunterпохоже это как-то связано с тем, что передается (создается) не новый объект - а ссылка. отсюда вопрос: .... Как (выделено оранжевый) передать не ссылку на объект - а создать новый ? Никак понять не могу. Создавать новый обьект нужно только тогда, когда в нем будут храниться другие данные. Если для тех же операциий и отображения тех же данных вы думаете как создать новый обьект - это ошибка в дизайне. Пересмотрите сначала порядок действий и "кто кого" ... Если вы это не решите - а заткнете баг какой-нибудь пробкой - то баг вылезет где-то еще, и будет уже трудноулавливаемый... ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2015, 10:24 |
|
Хендлер вызывается много раз
|
|||
---|---|---|---|
#18+
Именно в нем будут хранится новые данные. В случае если форма вызывается как модальное окно - ее закрытие можно контролировать. В остальных случаях всем рулит оконный менеджер и он принудительно вызывает dispose объекта. А поскольку ссылка на него - вот эксепшен и вылазит. Вернемся с чего начали - как же создать новый? Единственно что приходит на ум - вывести конструктор класса формы в паблик... Но тогда встает другой вопрос - если форм много то как указать какой именно использовать конструктор в хендлере нажатия на кнопку? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2015, 07:21 |
|
Хендлер вызывается много раз
|
|||
---|---|---|---|
#18+
ughunter, Вам надо разобраться с отличиями данных от кода. Код "нигде не хранится" - не копируется вместе с данными и память под него не выделяется, и не бывает двух разных "экземпляров кода". Делегат - это просто защищенная ссылка на некий код. Оставим в стороне реализацию - для простототы. Когда вы подписываетесь (+= ) на эвент - вы просто добавляете адрес функции (делегат) в коллекцию, которая будет использована при "поднятии" эвента. Очевидно, что если обработчик вызывается несколько раз - это значит, он несколько раз был добавлен в коллекцию. Поставьте брейкпойнт на += - и ловите, откуда происходит переподписка.... ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2015, 11:02 |
|
Хендлер вызывается много раз
|
|||
---|---|---|---|
#18+
ну Вы сказали, "на код память не выделяется" :) выделяется, просто в сегменте кода :) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2015, 12:04 |
|
Хендлер вызывается много раз
|
|||
---|---|---|---|
#18+
Roman Mejtesну Вы сказали, "на код память не выделяется" :) выделяется, просто в сегменте кода :) Я в кавычках написал. Это, кстати, довольно обычное заблуждение - когда предлагаешь весь код держать в соответственном классе, а таких обьектов коллекция - мне приходилось пару раз спорить, что место в памяти много раз будут занимать только данные... :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2015, 13:46 |
|
Хендлер вызывается много раз
|
|||
---|---|---|---|
#18+
D129, Согласен с Вами по всем пунктам. Обработчик действительно записан в коллекцию несколько раз, одна ведь при нажатии кнопки он вызывается один раз? А ведет себя как будто на кнопку нажали (2,3 ...) раза ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2015, 09:21 |
|
Хендлер вызывается много раз
|
|||
---|---|---|---|
#18+
ughunter, Вот этот код - Код: c# 1. 2. 3. 4. 5. 6. 7. 8.
Вызывает наибольшее подозрение. Кнопки, чтобы рисоваться на форме, должны быть в коллекции контролов формы .Controls И они там есть - раз вы их видите. А хендлер вы добавляте к кнопкам из коллекции buttons. Отсюда вопрос - те же самые ли это кнопки? Что делает PluginManager.AddItems(this, "АРМ"); ? Излишне, и не вполне правильно использовать еще одну коллекцию, назначение которой (перебор элементов коллекции) может выполнить уже существующая (.Controls).... ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2015, 11:37 |
|
|
start [/forum/topic.php?fid=20&msg=38882453&tid=1401901]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
34ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
others: | 374ms |
total: | 491ms |
0 / 0 |