2008-10-16 5 views
3

сценарий: 2 пользовательские элементы управления (foo.ascx и fum.ascx)ASP.NET Элементы управления пользователя Cross-Связь

Foo имеет метод, который действительно хотел бы получить доступ к свойству из ФУМ. Они живут на одной странице, но я не могу найти очень простой способ добиться такого рода общения.

Любые идеи?

ответ

0

Добавить событие в UserControl, подключенное к форме.

4
  • Добавить событие OnMyPropertyValueChanged в fum.ascx.
  • Добавьте соответствующий EventHandler в foo.ascx, который сохраняет значение свойства в частной переменной.
  • Прикрепите обработчик события foo.ascx к событию fum.ascx на странице_Load.
  • Поднять событие на fum.ascx Page_Load и по мере необходимости
  • Пусть метод foo.ascx использовать свою собственную переменную
+0

кто прилагает? страница? что создает зависимость страницы, зная о двух отношениях управления - увеличивая связь и зависимость. – 2008-10-17 01:03:57

+0

Samuel, обратите внимание, что страница - это ОДНА и ТОЛЬКО вещь, которая знает отношения контроля. Эти два элемента управления НЕ знают, что они связаны. – Panos 2008-10-17 07:53:41

0

Самое простое решение для ФУМ, чтобы сохранить значение в HttpContext.Current.Items [], где foo может прочитать его позже.

Более надежная опция - дать foo свойство, которое страница может заполнить ссылкой на fum.

Событие - это больше работы, но архитектурно лучше.

1

Есть несколько способов справиться с этим, но оптимально вы хотите, чтобы решение было как можно более развязанным.

Самый развязанный метод - это рекурсивный метод findControl, который перемещает модель объекта управления, пока не найдет требуемый элемент управления и не вернет ссылку.

private Control findControl(Control root, string id) 
{ 
    if (root.ID == id) 
    { 
     return root; 
    } 

    foreach (Control c in root.Controls) 
    { 
     Control t = findControl(c, id); 
     if (t != null) 
     { 
      return t; 
     } 
    } 

    return null; 
} 

Вот еще один подход, который является своего рода аккуратный, хотя я не знаю, если я бы использовал его (Несколько псевдокод):.

public FunkyUserControl : UserControl 
{ 
    private List<UserControl> subscribedControls; 

    public List<UserControl> Subscribers 
    { 
     get { return subscribedControls;} 
    } 

    public void SubscribeTo(UserControl control) 
    { 
     subscribedControls.Add(control); 
    } 
} 

унаследовать два UserControls от FunkyUserControl, а затем в ваш основной класс страницы вы можете сделать:

webControl1.SubscribeTo(webControl2); 
webControl2.SubscribeTo(webControl1); 

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

0

Вы можете ссылаться на другое пользовательское управление, используя FindControl по адресу Foo's Parent. Это самое простое, и вам не нужно ничего программировать в каждой основной (родительской) форме.

'From within foo...call this code<br> 
Dim objParent As Object<br> 
Dim lngPropID As Long<br> 

objParent = Me.Parent.FindControl("fum")<br> 
lngPropID= objParent.PropID 'public property PropID on fum<br>