【问题标题】:Passing value from One user control to another usercontrol将值从一个用户控件传递到另一个用户控件
【发布时间】:2010-06-10 09:52:21
【问题描述】:

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

UC1 有一个标签控件

UC2 有一个下拉列表控件

UC_Combined 是由 UC1 和 UC2 组合而成的

现在我将 UC_Combined.ascx 放在我的 aspx 页面 webForm1.aspx 上多了一个标签服务器控件

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

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

有人可以建议我如何做到这一点。

【问题讨论】:

  • 出于好奇,您到底想在这里实现什么?用户控件旨在跨多个页面/控件重用逻辑。用户控件之间不应该有依赖关系(可以有父/子 - 但不能有子/子) 为什么不将下拉控件/标签放在 UC_Combined 控件中?
  • 请输入代码。顺便说一句,您可以使用“家长”来访问家长控制,然后是您尝试访问的孩子。

标签: c# asp.net user-controls


【解决方案1】:

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

  1. 实现一个 PostBack 处理程序,它将 DropDownList 的值存储在 HTTP 上下文的“Items”集合中(通过 HttpContext.Current.Items["ddlValue"] = val)。 “Items”集合是一个哈希表,其生命周期为单个 HTTP 请求。这意味着它在当前 HTTP 请求得到响应后被清除。这是一种在组件之间传输数据的轻量级方式。
  2. 在 UC1 中实现一个属性,该属性可以延迟加载“Items”集合中的值,并使用 语法在标记中引用该属性。这样做可确保您在 Render 之前(即执行 代码时)、在执行 PostBack 处理程序事件并添加“Items”条目之后才尝试获取值.这样您就可以在同一个 PostBack 中执行所有操作。

认为你明白了吗?

【讨论】:

  • 不错。 +1。充分利用糟糕的情况 =)
【解决方案2】:

简单。在包含下拉列表的 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 是完全独立的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多