2013-03-30 85 views
0

我在此控制的控制Orders.ascx我有Grid.ascx這樣的事情到另一個控件的引用:從子控件訪問標籤

在我Orders.ascx我有我有一個下拉控件,其中包含一個事件處理程序方法用於索引更改的數量,當一行中選擇了不同的數量時,它將回發並根據數量更新價格。我需要每次回帖後向Orders.ascx中的標籤警告添加消息,但我的問題是此標籤位於父級控件中。我嘗試使用FindControl,它發現它,我可以設置文本,但它永遠不會更新警告標籤。

如何從索引更改控件上的下拉列表更新標籤文本?看來它不會每次我選擇數量注入。

回答

2

最簡單,最乾淨的方式是使用事件。

  1. 創建一個事件參數類,從EventArgs的派生,包括你想傳遞的數據屬性:

    public class PriceChangeEventArgs: EventArgs 
    { 
        public decimal Price { get; set; } 
    } 
    
  2. 設置在用戶控件的事件:

    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 + =新EventHandler的地方(page_PriceChanged); ?在負載部分? – user710502

+0

@ user710502假設用戶控件是在父代的標記中聲明的(而不是動態添加的),那應該起作用。你也可以在標籤中指定處理程序:''我很確定這也可以。 –