Asp.net 从子控件到父控件共享值
我对这方面比较陌生,但这是我的问题 在asp.net中,我有一个父控件和一个子控件。在子控件中,我有一个下拉列表。根据下拉列表的选定值,我想切换父控件中面板的可见性。例如,若我选择“在子控件下拉列表中显示”,我需要将true传递给父控件,以使面板可见,反之亦然。我该怎么做呢。我已经读到可以通过事件处理来实现,并且看到了某些场景,但我不清楚这一点。请帮忙Asp.net 从子控件到父控件共享值,asp.net,user-controls,web-controls,Asp.net,User Controls,Web Controls,我对这方面比较陌生,但这是我的问题 在asp.net中,我有一个父控件和一个子控件。在子控件中,我有一个下拉列表。根据下拉列表的选定值,我想切换父控件中面板的可见性。例如,若我选择“在子控件下拉列表中显示”,我需要将true传递给父控件,以使面板可见,反之亦然。我该怎么做呢。我已经读到可以通过事件处理来实现,并且看到了某些场景,但我不清楚这一点。请帮忙 谢谢。一种方法是公开下拉列表(public),并在父控件中检查子控件下拉列表,查看是否应在页面加载时显示或隐藏面板。这是否有效取决于页面生命周期
谢谢。一种方法是公开下拉列表(public),并在父控件中检查子控件下拉列表,查看是否应在页面加载时显示或隐藏面板。这是否有效取决于页面生命周期 另一种方法是将下拉值存储在更改事件的ViewState中。这样,父控件就可以读取ViewState参数
如果可能的话,你应该选择第一个选项。基本上,你只需要订阅
SelectedIndexChanged
事件并处理它。当所选项目发生更改时,将触发该事件。请注意,您应该允许下拉控件上的自动回发,以确保在用户更改下拉列表的值后立即触发事件
在ASPX文件中:
。请注意,事件是在
DropDownList
的祖先“ListControl”中声明的。引发父控件侦听的事件
在父控件的代码隐藏中,创建子控件类型的对象。比如:
private MyWebControl childControl;
然后在子控件中定义一个事件
public event System.EventHandler SelectionChanged;
在DropDownList的OnIndexchange事件中,在完成处理后,引发事件:
if(this.SelectionChanged!= null)
{
this.SelectionChanged(this, new EventArgs());
// You can send the index of the DDL in the event args
}
在父控件中,连接事件。第一页很好
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
}
应该是所有你需要让它工作 但另一个问题是,当在子控件的下拉列表中更改该值时,会在父控件的Page_Load事件触发后触发该事件,因此父控件始终会发现ViewState值为null。这适用于您的两种解决方案。如果在父控件的页面加载后为子控件选择了DexChanged下拉列表,则我无法读取父控件中的值…请尝试在父控件的“PreRender”事件中检查下拉列表的值。这应该在子控件上触发更改事件之后发生。Ondrej,这就是我尝试的。在IndexChanged上,我将ViewState[“HideSubmit”]=1。在父控件的Page_Load中,我正在获取ViewState的值,但它为null。正如我在下拉列表中更改值时注意到的,在父控件Page_Load中触发的第一个事件。在此范围内,它将查找ViewState[“HideSubmit”]null,因为SelectedIndexChanged事件尚未激发,并且ViewState的值尚未设置。在父控件的页面加载之后,它执行子控件中下拉列表的SelectedIndexChanged。@Ashar Syed viewstate是控件的本地状态。在父控件中,订阅子控件的事件或将代码放入周围的ASPX代码中-无论什么符合您的实际设计。我应该如何订阅子控件的事件。请你举个例子好吗。谢谢。@Ashar我在回答中就是这么做的,并提供了两种方法。嘿,谢谢!成功了:)。在您提供的解决方案之后,我做了一点修改,使之生效。非常感谢你的帮助。我真的很感激!如何在EventArgs中传递值?
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
}