我在此控件中有一个控件Orders.ascx
我引用了另一个控件Grid.ascx
,如下所示:
在Orders.ascx
我有:
<asp:Label id="warnings" runat="server" />
<uc:Grids id="uxGrid" runat="server/>
现在在网格( Grids.ascx )
中我有一个下拉控件,其中包含用于索引更改的事件处理程序方法的数量,当连续选择不同的数量时,它会回发并根据需要更新价格关于数量。我需要每回发一次都向Orders.ascx
中的标签警告添加消息,但我的问题是这个标签在父控件中。我尝试使用FindControl,它找到了它,我可以设置文本,但它永远不会更新警告标签。
如何从索引更改控件的下拉列表中更新标签文本?似乎每次我选择数量都不会注入。
答案 0 :(得分:2)
最简单,最干净的方法是使用一个事件。
创建一个派生自EventArgs的事件参数类,其中包含您要传递的数据的属性:
public class PriceChangeEventArgs: EventArgs
{
public decimal Price { get; set; }
}
在UserControl中设置一个事件:
public event EventHandler<PriceChangeEventArgs> PriceChanged;
在下拉列表索引中捕获更改时引发事件:
protected void DropDownList1_SelectedIndexChanged(object source, EventArg e)
{
PriceChangeEventArgs args = new PriceChangeEventArgs();
args.Price = Convert.ToDecimal(DropDownList1.SelectedValue);
PriceChanged(this, args);
}
在父控制页面或控件中处理事件:
UserControl1.PriceChanged += new EventHandler<MyEventArgs>(page_PriceChanged);
protected void page_PriceChanged(object source, MyEventArgs e)
{
Label1.Text = e.Price.ToString("C");
}
这样,你没有将你的用户控件绑定到你的页面:你仍然可以使用用户控制其他地方,并且页面不需要知道用户控件如何工作,除了它提出了一个事件
ETA:添加了一个我忽略的重要步骤:实际上提升了事件!