从儿童控制中访问标签

时间:2013-03-30 13:59:33

标签: c# asp.net user-controls

我在此控件中有一个控件Orders.ascx我引用了另一个控件Grid.ascx,如下所示:

Orders.ascx我有:

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

现在在网格( Grids.ascx )中我有一个下拉控件,其中包含用于索引更改的事件处理程序方法的数量,当连续选择不同的数量时,它会回发并根据需要更新价格关于数量。我需要每回发一次都向Orders.ascx中的标签警告添加消息,但我的问题是这个标签在父控件中。我尝试使用FindControl,它找到了它,我可以设置文本,但它永远不会更新警告标签。

如何从索引更改控件的下拉列表中更新标签文本?似乎每次我选择数量都不会注入。

1 个答案:

答案 0 :(得分: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");
    }
    
  5. 这样,你没有将你的用户控件绑定到你的页面:你仍然可以使用用户控制其他地方,并且页面不需要知道用户控件如何工作,除了它提出了一个事件

    ETA:添加了一个我忽略的重要步骤:实际上提升了事件!