DropDownList.Items.FindByValue() 引发 NullReferenceException

11

我希望有人能帮我解决一个小谜团......

这段代码在生产环境中运行正常。问题发生在我的本地主机上 (我正在测试一个在发布到staging之前所做的更改)。 这个功能之前一直在工作,但是两天前突然停止了工作,我不知道为什么会这样。

(这是一个 .NET 3.5 Web Forms 应用程序)

我有一个“组织”列表,这些组织可能已经报告了事故。该列表是从我的数据库中的Organization表填充的。

<asp:DropDownList ID="Organizations" runat="server" Width="205" AutoPostBack="True" DataTextField="Name" DataValueField="Id"></asp:DropDownList>

这是绑定列表的代码:

Organizations.DataSource = _service.ListOrganizations()
        .Where(o => o.IsDeleted == false && o.ReportedBy == true)
        .OrderBy(o => o.Name);
Organizations.DataBind();
Organizations.Items.Insert(0, new ListItem("Please make a selection", "-1"));
// Find the "VICTIM...." items
ListItem victim = Organizations.Items.FindByText("VICTIM");
ListItem guardian = Organizations.Items.FindByText("VICTIM'S PARENT/GUARDIAN");
ListItem child = Organizations.Items.FindByText("VICTIM'S SON/DAUGHTER");
ListItem partner = Organizations.Items.FindByText("VICTIM'S SPOUSE/DOMESTIC PARTNER");
ListItem unknown = Organizations.Items.FindByText("UNKNOWN");
// Move the "VICTIM...." items to the top of the list, under the default item
Organizations.Items.Remove(victim);
Organizations.Items.Remove(child);
Organizations.Items.Remove(guardian);
Organizations.Items.Remove(partner);
Organizations.Items.Remove(unknown);
Organizations.Items.Insert(1, victim);
Organizations.Items.Insert(2, guardian);
Organizations.Items.Insert(3, child);
Organizations.Items.Insert(4, partner);
Organizations.Items.Insert(5, unknown);
当我点击“编辑”图标以查看/编辑案例的详细信息时,我的应用程序尝试填充表单,但当它尝试设置组织列表的SelectedIndex时,我会收到一个NullReferenceException。
Organizations.SelectedIndex = Organizations.Items.IndexOf(Organizations.Items.FindByValue(organizationId));
如果我在这一行(上面)设置一个断点,我可以展开Items集合并查看它包含有效数据,甚至可以定位与我们寻找的organizationId相匹配的ListItem。 但是,当我按F10键时,立即抛出异常。
我将这一行拆分得更细以确定哪个部分会引发异常。
ListItem li = Organizations.Items.FindByValue(organizationId.Trim());
int idx = Organizations.Items.IndexOf(li);

我调用了 Trim() 函数来确保 organizationId 中没有不应该存在的空格。 Organziation.Items.FindByValue(organizationId.Trim()) 抛出异常,这对我来说毫无意义。如果项在列表中,为什么会找不到?

屏幕截图

Breakpoint: view organizationId

在这里,你可以看到我们正在尝试选择的 ListItem。它确实存在于 Items 集合中。

Breakpoint: view ListItem in Items collection, it does exist

我以为可能只是一个案例出现了问题,但事实并非如此。我已经尝试编辑多个案例,当表单被填充时,无论我尝试编辑哪个案例都会出现相同的问题。

欢迎提供任何建议/想法。提前感谢您的任何帮助。

编辑

(1) “你能确定到底抛出了哪个异常吗?” ...以下是异常详细信息 The exception detail

(2) 属性或索引器“System.Web.UI.WebControls.ListControl.SelectedItem”无法赋值--它是只读的。

Organizations.SelectedItem = Organizations.Items.FindByValue(organizationId);

(3) 如果我将代码修改为以下内容,我会得到相同的结果...它会抛出相同的异常

ListItem li = Organizations.Items.FindByValue(organizationId);

(4)"你尝试将它解析为int吗?你尝试检查它的长度了吗?" organizationId

(5) 这是匹配的ListItem ListItem

(6) 只是修改了代码为Organizations.Items.FindByValue(organizationId).Selected = true;。现在异常抛出在这行。我重新启动了我的机器,但是没有效果。


2
根据@freefaller的观点,IndexOf的内部可能会使用null参数抛出NullReferenceException异常。您可以通过分离IndexOf和FindByValue调用来测试它。 - neontapir
@freefaller 我添加了一个异常详细信息的截图。 - CDR12
@neontapir 我已经按照我在帖子中提到的方式分开了 IndexOf 和 FindByValue 的调用。 - CDR12
那个异常截图并没有什么帮助,除了告诉我代码中的某些内容为空,而不应该是这样的...如果没有能够使用您的数据逐步执行代码的能力,我们无法真正提供帮助。 - freefaller
如果您建议限制评论,我将继续编辑我的帖子并附上结果。 - CDR12
显示剩余9条评论
1个回答

6

好的,在浪费了一天半的时间之后,我找到了解决方法...

我知道最终会是某些愚蠢的问题...

因此,我达到了某种绝望的程度,开始逐个检查Items集合中的87个ListItems。其中两个ListItemsnull(??),这就解释了为什么这里的NullReferenceException看起来如此不合适。一旦我对列表进行了更改以删除null项,原始代码就再次工作了。

Organizations.SelectedIndex = Organizations.Items.IndexOf(Organizations.Items.FindByValue(organizationId));

感谢所有抽出时间帮助我解决这个问题的人!

做得好,找出这个问题了……我不确定我会想到列表中的空项!! :-) - freefaller

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