将值从一个用户控件传递到另一个用户控件

时间:2010-06-10 09:52:22

标签: c# asp.net user-controls

我有三个用户控件uc1.ascx,uc2.ascx,UC_Combined.ascx

UC1有一个标签控件

UC2有一个下拉列表控件

UC_Combined是通过组合UC1和UC2

创建的

现在我将UC_Combined.ascx放在我的aspx页面上webForm1.aspx还有一个Label servercontrol

现在,当我运行webForm1.aspx页面时,我可以看到DropDown列表和标签

现在,当我从下拉列表中选择一个项目时,我希望选择的值显示给标签

有人可以建议我怎么做。

2 个答案:

答案 0 :(得分:1)

最好在父控件和子控件之间创建依赖关系。你通常应该避免的事情。但是,如果你必须这样做或以某种方式使你的生活更轻松,那么有一些技术可以实现这一点,同时保持控制有点脱钩。我建议你做以下事情:

  1. 实现一个PostBack处理程序,它将DropDownList的值存储在HTTP Context的“Items”集合中(通过HttpContext.Current.Items [“ddlValue”] = val)。 “Items”集合是一个散列表,具有单个HTTP请求的生命周期。这意味着在响应当前HTTP请求后将其清除。这是一种在组件之间传输数据的轻量级方法。
  2. 在UC1中实现一个属性,该属性延迟加载“Items”集合中的值,并使用<%=%>引用标记中的属性句法。这样做可以确保在执行PostBack处理程序事件并且“Items”条目已经执行之后,在Render(执行<%=%>代码的时间)之前不会尝试获取值。已被添加。这样你就可以在同一个PostBack中做所有事情。
  3. 认为你明白了吗?

答案 1 :(得分:1)

易。在包含下拉列表的uc上实现一个事件,如:

    public event EventHandler<DDSelectionChangedEventArgs> DDSelectionChanged;

    public virtual void OnDDSelectionChanged(DDSelectionChangedEventArgs e)
    {
        if (DDSelectionChanged != null)
        {
            DDSelectionChanged(this, e);
        }
    }

选择更改了dd的处理程序,然后必须调用OnDDSelectionChanged。

在页面(aspx)中为该事件注册处理程序。然后,此处理程序应该使用文本框在第二个uc上调用类似ChangeText(text)的内容。文本框已更新。

因此,uc之间的通信是由事件驱动的,并且页面具有将事件连接起来的可靠性。 uc是完全独立的。