【问题标题】:WebForms ListBox - adding an item doesn't work if ListBox contains item alreadyWebForms ListBox - 如果 ListBox 已经包含项目,则添加项目不起作用
【发布时间】: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_LoadIsPostBack 属性下做了很多事情。

标签: c# vb.net webforms


【解决方案1】:

我通过将 ListBox 中存在的项目记录在单独的列表中来解决此问题,然后在添加记录的列表和新条目之前清除实际的 ListBox

我不知道为什么这是必要的,这看起来很奇怪,但我们开始了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多