【问题标题】:Sharing value from child to parent control从子控件到父控件共享值
【发布时间】:2010-10-11 19:20:40
【问题描述】:

我对此比较陌生,但这是我的问题。

在 asp.net 中,我有一个父控件和一个子控件。在子控件中,我有一个下拉列表。根据下拉列表的选定值,我想在父控件中切换面板的可见性。例如,如果我选择在子控件下拉列表中显示,我需要将 true 传递给父控件以使面板可见,反之亦然。我该怎么做。我已经阅读了可以通过事件处理来完成的内容,并且已经看到了某些场景,但我不清楚这一点。请帮忙!

谢谢。

【问题讨论】:

    标签: asp.net user-controls web-controls


    【解决方案1】:

    引发您的父控件侦听的事件。

    在父控件的代码中,创建一个子控件类型的对象。比如:

    private MyWebControl childControl;
    

    然后在子控件中,定义一个事件

    public event System.EventHandler SelectionChanged;
    

    在您的 DropDownList 的 OnIndexChanged 事件中,在您完成处理后,引发您的事件:

    if(this.SelectionChanged!= null)
    {
         this.SelectionChanged(this, new EventArgs()); 
         // You can send the index of the DDL in the event args
    }
    

    在您的父控件中,连接事件。 Page_Init 不错

    this.childControl.SelectionChanged+=new EventHandler(childControl_SelectionChanged);
    

    仍然在父控件中,定义你的方法

    private void childControl_SelectionChanged(object sender, EventArgs e)
    {
          /// Do your processing here.
          /// Grab the DDL's index from the EventArgs and do your processing
    
    }
    

    应该是让它工作所需的一切!

    【讨论】:

    • 嘿,谢谢!那行得通:)。在您提供的解决方案之后,我进行了一些修改。非常感谢你的帮助。我真的很感激!
    • 我应该如何在 EventArgs 中传递一个值?
    【解决方案2】:

    一种方法是公开下拉列表(公共)并在您的父控件中检查子控件下拉列表,以查看它是否应该在页面加载时显示或隐藏面板。这是否有效取决于页面生命周期。

    另一种方法是在更改事件上将下拉值存储在 ViewState 中。这样父控件就可以读取 ViewState 参数。

    如果可能,您绝对应该选择第一个选项。

    【讨论】:

    • 但是另一个问题是当子控件的下拉列表中的值发生变化时,该事件是在父控件的Page_Load事件触发后触发的,所以父控件总是发现ViewState值为null。这适用于您的两种解决方案。如果在父级的 Page_Load 之后触发子级下拉菜单的 SelectedIndexChanged,我可能无法读取父级中的值...
    • 尝试检查父控件“PreRender”事件中下拉列表的值。这应该在子控件上触发更改事件之后发生。
    【解决方案3】:

    基本上,您只需要订阅SelectedIndexChanged 事件并处理它。当所选项目被更改时触发该事件。请注意,您应该允许下拉控件上的自动回发,以确保在用户更改下拉值后立即触发事件。

    在 ASPX 文件中:

    如果您在代码隐藏中创建控件,请在创建控件后订阅,如下所示:

    dropDown.SelectedIndexChanged += OnDropDownChanged;
    

    然后处理它:

    public void OnDropDownChanged(object sender, EventArgs e)
    {
        // alter the panel's visibility here; the drop down's value contains
        // the selected item; note that you shoud use "(DropDownList)sender"
        // to access it
    }
    

    编辑:另外,看看更详细的example on MSDN。请注意,该事件是在DropDownList 的祖先“ListControl”中声明的。

    【讨论】:

    • Ondrej,这就是我尝试过的。在 IndexChanged 上,我设置 ViewState["HideSubmit"] = 1。在父控件的 Page_Load 中,我正在获取 ViewState 的值,但它为 null。
    • 正如我在更改下拉列表中的值时注意到的那样,在父控件 Page_Load 中触发的第一个事件。在此,它发现 ViewState["HideSubmit"] null 因为 SelectedIndexChanged 事件尚未触发且 ViewState 的值尚未设置。它是在父的 Page_Load 之后执行子控件中的下拉菜单的 SelectedIndexChanged。
    • @Ashar Syed 视图状态对于控件来说是本地。在父控件中订阅子控件的事件将代码放入周围的 ASPX 代码中——无论您的实际设计如何。
    • 我应该如何订阅子控件的事件。请你举个例子。谢谢。
    • @Ashar 我刚刚在回答中这样做了,并为您提供了两种方法。
    猜你喜欢
    • 2011-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-16
    • 2017-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多