【发布时间】:2020-09-11 08:28:09
【问题描述】:
我有一个列表框:
<asp:ListBox runat="server" ID ="lbxIncidentsSel" Rows="4" SelectionMode="Single"></asp:ListBox>
还有一些代码通过点击按钮触发添加一些项目:
Protected Sub btnIncidentsAdd_Click(sender As Object, e As EventArgs)
Dim lbxIncidentsSel As ListBox = CType(NormalFormView.FindControl("lbxIncidentsSel"), ListBox)
' logic here is unimportant
lbxIncidentsSel.Items.Add(SomeItem) ' this can be a list of items
lbxIncidentsSel.DataBind()
End Sub
对于我尝试添加的第一个项目,这些项目将正常添加,并显示在页面上的lbxIncidentsSel ListBox 上。
我尝试添加的下一个项目,这些项目将正确添加到代码隐藏中,我可以在 Items 向下钻取中看到它们,但随后在页面呈现时它们 不显示。
如果我尝试重新添加相同的项目或其他项目,在代码隐藏中,第二批不再在列表中并且整个过程重复 - 它会正确地将其添加到代码隐藏中,但不会添加在显示器上。
为什么这对我添加的第一个项目(或一组项目)有效,而对其他任何项目都无效?
请注意代码在 vb.net 中,但问题也出现在 c# 代码隐藏中
【问题讨论】:
-
尝试不使用
DataBind()调用。 -
它最初没有DataBind,我只是把它放进去尝试修复它。我不得不求助于清除列表中的所有项目并恢复它们以及新的项目。只有这样我才能让它工作。
-
好的,值得考虑。不过,我只是注意到了一些事情。您正在声明变量
lbxIncidentsSel,其名称与您赋予控件的名称相同。这可能与它有关(尚未测试)。你为什么还要使用FindControl构造?只需在您的代码中直接引用ListBox控件,就像您在其他任何地方一样。注释掉变量声明行并运行它。它应该可以按您的预期工作。 -
因为它是一个可怕的 web 表单页面,具有不同的视图,可以随时处于活动状态,这意味着
lbxIncidentsSel并不总是可用于代码隐藏,具体取决于哪个视图处于活动状态,所以我不能直接引用它,否则只要正确的视图不活动,页面加载就会出错。 -
几年前一时兴起,我构建了一个类似的 SPA WebForms 应用程序。起初我以为我很聪明,但从长远来看,我最终后悔了。事实证明,这是一场维护和调试的噩梦。我怀疑这个问题与这种架构对自然 ASP.NET 页面循环的中断有关。如果我没记错的话,我最终在
Page_Load的IsPostBack属性下做了很多事情。