gpt4 book ai didi

c# - 为什么我的子控件在事件附加时未初始化?

转载 作者:太空宇宙 更新时间:2023-11-03 14:35:32 26 4
gpt4 key购买 nike

我有一个页面和一个用户控件——我们称它们为 Detail.aspx 和 Selector.ascx。

假设该页面显示了数据库中各个记录的详细信息。用户控件基本上由一个 DropDownList 控件和一些关联的 HTML 组成。 DropDownList 显示可随时切换到的其他记录的列表。

当 DropDownList 触发其 SelectedIndexChanged 事件时,我希望父页面(在本例中为 Detail.aspx)处理它。毕竟,他需要知道选择了什么,以便他可以适本地更改 URL 和显示的详细信息等。

为此,我做了我通常做的事情,这也是 this StackOverflow question 中的最佳答案所说要做的事情。 :

public event EventHandler DropDownSelectedIndexChanged
{
add
{
MyDropDownList.SelectedIndexChanged += value;
}
remove
{
MyDropDownList.SelectedIndexChanged -= value;
}
}

以上代码出现在 Selector.ascx.cs 代码隐藏文件中。

因此,在 Detail.aspx 上,我可以像这样使用它:

<cc1:RecordSelector ID="RecordSelector1" runat="server"
OnDropDownSelectedIndexChanged="RecordSelector1_DropDownSelectedIndexChanged" />

到目前为止,没有什么特别或令人惊讶的。

这是我的问题:

当浏览器点击 Detail.aspx 时,这会导致 NullReferenceException

调试问题表明,当页面第一次被点击时,我上面显示的公共(public)事件试图添加事件,但 MyDropDownList 为 null,因此抛出异常。据我所知,事件是在 Selector 用户控件的 Load 事件触发之前添加(或试图添加)的,因此也是在 DropDownList 的 Load 事件触发之前添加的。

奇怪的是,如果我从 Detail.aspx 中省略 OnDropDownSelectedIndexChanged 属性,而是将以下内容放在 Detail.aspx.cs 的 Page_Load 事件中:

protected void Page_Load(object sender, EventArgs e)
{
RecordSelector1.DropDownSelectedIndexChanged += new EventHandler(RecordSelector1_DropDownSelectedIndexChanged);
}

它完全按照预期工作。这些事件已附加并处理得很好。没问题。

但这意味着一些坏事:

  1. 我必须记住不要使用设计器将所述事件添加到我的用户控件上
  2. 我必须记住在源代码 View 中工作时不要通过属性添加事件
  3. 最糟糕的是,作为控件的作者,我需要确保使用我的控件的其他人都知道 1 和 2

那我做错了什么?到目前为止,我看到的每个示例都显示了通过用户控件公开子控件事件的类似用法。

最佳答案

这样做的原因:

protected void Page_Load(object sender, EventArgs e)
{
RecordSelector1.DropDownSelectedIndexChanged
+= new EventHandler(RecordSelector1_DropDownSelectedIndexChanged);
}

这不是:

<cc1:RecordSelector ID="RecordSelector1" runat="server"
OnDropDownSelectedIndexChanged="RecordSelector1_DropDownSelectedIndexChanged" />

是因为第一个添加处理程序之后控件已初始化(通过页面的Init)。第二个示例被更早地解析,因此页面试图在控件初始化之前添加处理程序。

由于页面生命周期的性质,我认为您可能不得不忍受在代码隐藏中添加事件处理程序。在控件初始化之前无法添加处理程序,因为该控件在初始化之前始终为 null

关于c# - 为什么我的子控件在事件附加时未初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1233852/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com