好的,所以这可能不是最好的答案,但我认为您遇到的问题是 UpdatePanel 无法看到子控件的事件。好消息是,它很容易修复。假设您有一个控件(CatchMyEvent,顺便说一句,这是一个非常聪明的名字)并且它上面有一个 DropDownList。现在您希望父页面在该列表上看到 SelectedIndexChanged 事件并更新标签以匹配 SelectedItem.Text。事实上,父母真的不能这样做。所以让我们改变一下:
public partial class CatchMyEvent : System.Web.UI.UserControl
{
public delegate void ChangedIndex(object sender, EventArgs e);
public event ChangedIndex SelectedIndexChanged;
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
dropDownListThrow.SelectedIndexChanged += new EventHandler(dropDownListThrow_SelectedIndexChanged);
labelOutput.Text = "no";
}
public void dropDownListThrow_SelectedIndexChanged(object sender, EventArgs e)
{
labelOutput.Text = ((DropDownList)sender).SelectedItem.Text;
if(SelectedIndexChanged != null)
{
SelectedIndexChanged(sender, e);
}
}
}
基本上我所做的只是让控件捕获 DropDownList 的 SelectedIndexChanged 事件并触发它,以便任何父页面或控件都可以看到它。基本上我所做的就是把它传递下去。现在在父页面上,它真的很容易捕获。
您只需要添加一个带有触发器的 UpdatePanel,该触发器包含:
<asp:AsyncPostBackTrigger ControlID="catchMyEventMain" EventName="SelectedIndexChanged" />
...当然,将其添加到父页面后面的代码中:
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
catchMyEventMain.SelectedIndexChanged += dropDownListThrow_SelectedIndexChanged;
}
public void dropDownListThrow_SelectedIndexChanged(object sender, EventArgs e)
{
labelSelectedValue.Text = ((DropDownList)sender).SelectedItem.Text;
}
其中标签是前面提到的标签。然后让魔法发生。
还有两个注意事项:
1) 不要像我在测试它时那样傻,忘记将 DropDownList 上的 AutoPostBack 属性设置为 true。
2) 确保标签在 UpdatePanel 的 ContentTemplate 中。
希望这可以帮助。