Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 从子控件到父控件共享值_Asp.net_User Controls_Web Controls - Fatal编程技术网

Asp.net 从子控件到父控件共享值

Asp.net 从子控件到父控件共享值,asp.net,user-controls,web-controls,Asp.net,User Controls,Web Controls,我对这方面比较陌生,但这是我的问题 在asp.net中,我有一个父控件和一个子控件。在子控件中,我有一个下拉列表。根据下拉列表的选定值,我想切换父控件中面板的可见性。例如,若我选择“在子控件下拉列表中显示”,我需要将true传递给父控件,以使面板可见,反之亦然。我该怎么做呢。我已经读到可以通过事件处理来实现,并且看到了某些场景,但我不清楚这一点。请帮忙 谢谢。一种方法是公开下拉列表(public),并在父控件中检查子控件下拉列表,查看是否应在页面加载时显示或隐藏面板。这是否有效取决于页面生命周期

我对这方面比较陌生,但这是我的问题

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


谢谢。

一种方法是公开下拉列表(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

}