从子控件分享值到父控件

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

4
触发一个事件,让你的父控件监听它。
在父控件的代码中,创建一个与子控件类型相同的对象。比如像这样:
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

}

这应该是你需要让它正常工作的全部内容!


嘿,谢谢!那个解决方案起作用了:)。在你提供的解决方案之后,我进行了一些修改,然后它就起作用了。非常感谢您的帮助。我真的很感激! - Ashar Syed
我应该如何在EventArgs中传递一个值? - Ashar Syed

0

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

在ASPX文件中:

<asp:DropDownList … OnSelectedIndexChanged="OnDropDownChanged">…</asp:dropDownList>

如果您是在代码后台创建控件,请在创建控件后订阅,如下所示:

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
}

编辑:此外,请查看更详细的MSDN上的示例。请注意,该事件在DropDownList的祖先“ListControl”中声明。


Ondrej,我试过了,当 IndexChanged 事件触发时,我设置了 ViewState ["HideSubmit"] = 1。在父控件的 Page_Load 中,我获取 ViewState 的值,但它为 null。 - Ashar Syed
据我观察,当我更改下拉列表中的值时,父控件的 Page_Load 事件是第一个被触发的。在此期间,它会查找 ViewState["HideSubmit"] 是否为空,因为 SelectedIndexChanged 事件尚未被触发,ViewState 的值尚未设置。只有在父控件的 Page_Load 事件执行完毕后,才会执行子控件中下拉列表的 SelectedIndexChanged 事件。 - Ashar Syed
@Ashar Syed,视图状态是控件的本地属性。在父控件中订阅子控件的事件 将代码放入周围的 ASPX 代码中 - 具体取决于你实际的设计。 - Ondrej Tucny
我该如何订阅子控件的事件?能否提供一个例子?谢谢。 - Ashar Syed
@Ashar,我在我的答案中刚刚做到了这一点,并为您提供了两种方法。 - Ondrej Tucny

0

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

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

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


但是另一个问题是,当子控件的下拉列表中的值被更改时,在父控件的Page_Load事件触发之后触发了该事件,因此父控件总是将ViewState值视为null。这适用于您的两个解决方案。如果在父控件的Page_Load之后触发了子下拉列表的SelectedIndexChanged事件,我就无法读取父控件中的值... - Ashar Syed
尝试在父控件的“PreRender”事件中检查下拉框的值。这应该发生在子控件触发更改事件之后。 - Merrimack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接