2013-03-30 4 views
0

У меня есть контроль Orders.ascx в этом элементе управления У меня есть ссылка на другой элемент управления Grid.ascx что-то вроде этого:Доступ ярлык из дочернего элемента управления

В моем Orders.ascx у меня есть:

<asp:Label id="warnings" runat="server" /> 
    <uc:Grids id="uxGrid" runat="server/> 

Теперь в сетке (Grids.ascx) У меня есть выпадающий элемент управления, который имеет количество с методом обработчика событий для изменения индекса, когда в строке выбирается другое количество, оно возвращается и обновляет цену в зависимости от количества. Мне нужно, чтобы каждый раз, когда он возвращал сообщения, чтобы добавить сообщение в предупреждения меток в Orders.ascx, но моя проблема в том, что этот ярлык находится в родительском элементе управления. Я попытался использовать FindControl, и он находит его, и я могу установить текст, но он никогда не обновляет метку предупреждений.

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

ответ

2

Простейшим, самым чистым способом было бы использовать событие.

  1. Создание класса аргумента события, производный от EventArgs, который включает в себя свойство для данных, которые вы хотите передать:

    public class PriceChangeEventArgs: EventArgs 
    { 
        public decimal Price { get; set; } 
    } 
    
  2. Настройка события в UserControl:

    public event EventHandler<PriceChangeEventArgs> PriceChanged; 
    
  3. Поднять мероприятие при внесении изменений в индекс выпадающего списка:

    protected void DropDownList1_SelectedIndexChanged(object source, EventArg e) 
    { 
        PriceChangeEventArgs args = new PriceChangeEventArgs(); 
        args.Price = Convert.ToDecimal(DropDownList1.SelectedValue); 
        PriceChanged(this, args); 
    } 
    
  4. Обрабатывать событие на странице родительского контроля или управления:

    UserControl1.PriceChanged += new EventHandler<MyEventArgs>(page_PriceChanged); 
    
    protected void page_PriceChanged(object source, MyEventArgs e) 
    { 
        Label1.Text = e.Price.ToString("C"); 
    } 
    

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

ETA: Добавлен важный шаг, который я пропустил: действительно поднял событие!

+0

Спасибо !, где было бы лучшим подходящим местом для добавления UserControl1.PriceChanged + = new EventHandler (page_PriceChanged); ? в разделе «Загрузка»? – user710502

+0

@ user710502 Предполагая, что элемент управления пользователя объявлен в разметке родителя (в отличие от динамического добавления), это должно работать. Вы также можете указать обработчик в теге: '' Я уверен, что это тоже сработает. –

Смежные вопросы