Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.01.2013, 14:31   #1
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию Одно событие для нескольких форм

Здравствуйте уважаемые программисты, столкнулся на мой взгляд с такой не тривиальной задачей ну и никак не приходит в голову ее решение.
Объясню по порядку в теории как все должно работать...

Есть некая форма аутентификации. http://prntscr.com/pwat5
Данная форма уместилась на TabControl->TabItem а TabControl в свою очередь размещен на компоненте Grid.
Собственно, на данной кнопке входа весит событие, по клику выполнять аутентификацию и сменить форму аутентификации на другую форму.
Таких форм аутентификации мне необходимо большее количество, для это я поступил следующим образом и разложил данные формы по определенным компонентам, структура выглядит примерно следующим образом:

Код:
Grid
 ListBoxItem
  MyAuthForm
   ... //Ну и собственно остальная лабуда наложенная на форму MyAuthForm
Для идентичной копии моей формы MyAuthForm я клонирую данный объект, а быть точнее я клонирую ListBoxItem вместе со всем его содержимым в новый объект и соответственно добавляю его в данный компонент Grid, то есть получаю новый клонированный объект.

Код:
Grid
 ListBoxItem
  MyAuthForm
   ... //Ну и собственно остальная лабуда наложенная на форму 
 ListBoxItemСlone
  MyAuthFormСlone
   ... //Ну и так далее
Но проблема в том, что, мой оригинальный объект несет с собой различные события а вот клонированный объект уже не может выполнить данные события определенные в оригинальном.
Как возможно решить данную задачу? Чтобы клонированный объект как-то мог ссылаться на события оригинального объекта?
Вообщем, объяснил как мог, надеюсь максимально доступно изложил чего желаю, огромное спасибо за любые подсказки и идеи, второй день мучаюсь с этим делом и пока никаких идей.

п.с. В ручную для каждого клонированного объекта, мне нельзя создавать события ибо таких форм аутентификации может быть более чем достаточно, все должно быть динамично, поэтому единственный вариант это как-то ссылаться на уже созданные события, wpf допускает такую возможность?

Последний раз редактировалось coNsept; 21.01.2013 в 14:39.
coNsept вне форума Ответить с цитированием
Старый 21.01.2013, 18:28   #2
masax
Форумчанин
 
Регистрация: 01.10.2008
Сообщений: 248
По умолчанию

можно при создании динамически навешивать на форму нужные события
или если хочется использовать данные из другой формы, то используй Application.OpenForms - это массив открытых форм

т.е. доступ к Form1 (например), которая открыта первой, выглядит так:
Код:
var form = Application.OpenForms[0] as Form1;
Контакты
skype, почта: bm@kwax.ru
masax вне форума Ответить с цитированием
Старый 21.01.2013, 21:14   #3
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Нет, такой вариант мне не подходит. Мне нужно как-то ссылаться клонированными объектами на те события которые уже определенны.
coNsept вне форума Ответить с цитированием
Старый 22.01.2013, 11:27   #4
masax
Форумчанин
 
Регистрация: 01.10.2008
Сообщений: 248
По умолчанию

объясни какие именно события надо привязать?
Контакты
skype, почта: bm@kwax.ru
masax вне форума Ответить с цитированием
Старый 22.01.2013, 16:11   #5
Work1214
Новичок
Джуниор
 
Регистрация: 22.01.2013
Сообщений: 1
Хорошо Разработчик C#

Срочно ищем разработчика C# в очень крупный проект, в классную команду!!)
Нужно:
- отличное знание ADO.NET;
- паттернов проектирования;
- хорошие коммуникации

Работа в рамках крупного медиа-холдинга, расположенного в центре (станция метро Тверская). Для активной и качественной работы предоставляется комфортно и креативно оформленный офис, любая ПК-платформа (Windows, MAC). По необходимости - 2 монитора + пуфик

З/П - 90 000-120 000 (белая).

Для того, чтобы более подробно ознакомиться с вакансией, звоните по тел.: 8(926)728-75-65, также присылайте свои резюме на почту: sselenav@mail.com

С уважением,
Елена
Work1214 вне форума Ответить с цитированием
Старый 22.01.2013, 17:08   #6
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Цитата:
объясни какие именно события надо привязать?
Ну допустим мой объект содержит до десятка событий.

Структура объекта:

Для примеру приведу несколько наложенных компонентов на форму с событиями.
Код:
MainWindow
 -> Grid 
  -> ListBoxItem
   -> Button (Click)
   -> EditBox (PreviewTextInput)
   -> ListBox (SelectionChanged)
Далее клонирую ListBoxItem и его содержимое и добавляю в данный компонент Grid клонированный объект, то есть получается следующая структура:

Код:
MainWindow
 -> Grid 
  -> ListBoxItem
   -> Button (Click)
   -> EditBox (PreviewTextInput)
   -> ListBox (SelectionChanged)
  -> ListBoxItemCloned
   -> ButtonCloned
   -> EditBoxCloned
   -> ListBoxCloned
Но после клонирования, ButtonCloned, EditBoxCloned и т.д не реагирует на события, ну тут все понятно, это новый объект и он никак не в курсе об этом событие.
Что мне нужно сделать? Мне нужно сделать так чтобы клонированный объект с его содержимом как бы знал о подписанных событиях оригинального объекта и так же был подписан на это событие.
coNsept вне форума Ответить с цитированием
Старый 23.01.2013, 13:28   #7
Reskov
Форумчанин
 
Аватар для Reskov
 
Регистрация: 17.12.2008
Сообщений: 250
По умолчанию

указатель на делегат вычисляется в рантайме, насколько я понимаю, это невозможно...
1) попробуй сосздать свой контрол с вашими методами и сделайте у него метод клонирования
2) поробуйте принудительно клонировать делегаты вызвав clone у всей цепочки

Ps не уверен что это поможет) и не уверен что я прав ввообще, память может подводить)
Reskov вне форума Ответить с цитированием
Старый 23.01.2013, 19:19   #8
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Можно пример второго пункта?
coNsept вне форума Ответить с цитированием
Старый 23.01.2013, 20:56   #9
Reskov
Форумчанин
 
Аватар для Reskov
 
Регистрация: 17.12.2008
Сообщений: 250
По умолчанию

я набрасал что-то типо такого
Код:
 public void CloneEvents(Component item1, Component item2)
        {
            var eventsField = typeof(Component).GetField("events", BindingFlags.NonPublic | BindingFlags.Instance);
            var eventHandlerList = eventsField.GetValue(item1) as EventHandlerList;
            var listEntry = typeof(EventHandlerList).GetField("head", BindingFlags.NonPublic | BindingFlags.Instance);
            var list = listEntry.GetValue(eventHandlerList);
            var res = new List<Tuple<Delegate, object>>();
            if (list == null)
            {
                return;
            }
            var next = list.GetType().GetField("next", BindingFlags.NonPublic | BindingFlags.Instance);
            var del = list.GetType().GetField("handler", BindingFlags.NonPublic | BindingFlags.Instance);
            var key = list.GetType().GetField("key", BindingFlags.NonPublic | BindingFlags.Instance);
            while (list != null)
            {

                var deleg = del.GetValue(list) as Delegate;
                res.Add(new Tuple<Delegate, object>(deleg.Clone() as Delegate, key.GetValue(list)));
                list = next.GetValue(list);
            }
            var events = eventsField.GetValue(item2) as EventHandlerList;
            foreach (var tuple in res)
            {
                events.AddHandler(tuple.Item2, tuple.Item1);
            }


            eventsField.SetValue(item2, events);
        }
использование
Код:
CloneEvents(button1, button2);
Ps это хак чистой воды... использовать можно, но осторожно.
Reskov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Два нажатия - одно событие.(Delphi) Necare Помощь студентам 15 24.02.2012 16:03
ShowModal для нескольких форм Марк Охман Общие вопросы Delphi 9 03.12.2010 22:14
Создание нескольких форм Лера123 Общие вопросы Delphi 4 16.10.2010 18:16
Событие OnChange - на одно из полей namazi74 БД в Delphi 4 22.04.2010 12:52
Как в QRepopt отображать одно и тоже поле в нескольких колонках? Milishka БД в Delphi 2 19.04.2010 14:37