【问题标题】:How do you avoid duplicate items when a databound control gets bound twice?当数据绑定控件被绑定两次时,如何避免重复项?
【发布时间】:2010-02-01 19:13:55
【问题描述】:

在这种情况下如何避免重复绑定项:

页面上有一个数据绑定控件(在本例中为 DropDownList,尽管我认为这并不重要)。它的 AppendDataBoundItems 设置为“true”。在代码的某处,设置了 DataSource 并调用了 DataBind。所以这个控件是明确绑定的。

你有一堆其他的东西要绑定在页面上,所以你调用 Page.DataBind。

您的数据绑定控件现在包含重复项。它是 (1) 显式绑定的,然后 (2) Page.DataBind 再次绑定它。由于 AppendDataBoundItems 为 true,因此第二个绑定附加到第一个绑定,您最终会得到双倍的项目。

几个限制:

  1. 在控件上对 DataBind 的显式调用是通过一些集中式代码完成的,更改起来会很痛苦。

  2. 我确实需要将页面的其余部分绑定在一起(通过 Page.Databind()),因为有太多其他数据绑定元素需要单独完成,而无需编写大量单独的调用。

我需要一个类似... Page.DataBindExceptIfTheyHaveAlreadyBeenBoundDuh() 的方法

【问题讨论】:

    标签: asp.net data-binding


    【解决方案1】:

    在执行 Control.DataBind() 后关闭 AppendDataBoundItems。然后你 Page.DataBind() 不会再次附加项目。

    DropDownList.DataSource = Data;
    DropDownList.DataBind();
    DropDownList.AppendDataBoundItems = false;
    

    【讨论】:

      【解决方案2】:

      底线是没有很好的解决方案。您需要构建您的页面,以便它们不会绑定控件两次,这意味着在必要时重写页面的某些部分。这样做的痛苦比解决方法要好。

      【讨论】:

        【解决方案3】:

        您可以将AppendDataBoundItems="False" 设置为 DropDownList 并在 DataBound 事件中添加和选择一个新的列表项,如下所示:

            protected void ddlNeighborhoods_DataBound(object sender, EventArgs e)
            {
                ListItem li = new ListItem("- Select -", "-1", true);
                li.Selected = true;
                ddlCities.Items.Insert(0, li);
            }
        

        【讨论】:

          【解决方案4】:

          我过去多次遇到过这个问题,我发现的最佳解决方案几乎适用于我遇到的所有情况;是使用 UNION 选择 -1 作为值,'- 选择 -' 作为文本。

          即使您在网格中有网格并且数据绑定到该内部网格中的用户控件中的下拉列表,这也有效。

          使用代码隐藏加载网格将不允许数据绑定到用户控件字段。

          我希望这个提示对您有所帮助...

          【讨论】:

            【解决方案5】:

            当您不想进行太多会破坏页面/控件其余部分的更改时,通常会在遗留代码中发生这种情况。在某些使用下拉列表的情况下,您可能必须清除 dropdownlist.databinding 事件中的项目作为快速修复。

            protected void DropDownList1_DataBinding(object sender, EventArgs e)
            {
                if((sender as DropDownList).Items.Count > 0)
                {
                        (sender as DropDownList).Items.Clear();
                }
            }
            

            注意:如果项目值发生变化,您应该小心执行此操作。

            【讨论】:

            • DropDownList 上是否有任何属性可以告诉我它是否已被绑定?
            • 我不知道,但是如果你使用这个事件你就知道它还没有被绑定。它还有一个 DataBound 事件,以防你需要在那个时间点知道一些事情。
            • 如果您一开始没有手动添加任何项目,则项目数应该始终为零,一旦绑定它应该有超过零个项目(除非您绑定到具有没有数据)。如果需要,您还可以检查 Page.IsPostBack。
            【解决方案6】:

            我在 asp.net 从 mysql 数据库中检索值时遇到过这种情况。在自动回发时,这些值被添加到下拉列表中已经存在的值中。

            解决方案: 我有一个 sqlcommand 来首先计算数据库表中相关的行数。并将值存储在 Intvariable1 中

            然后声明另一个 intVariable。有过

            session("intvariable")=Dropdownlist1.items.count
            
            while session("intvariable") > session("intvariable1")
            
            Dropdownlist1.items.removeAt(Session("intvariable")-1)
            
            session("intvariable)-=1
            
            End while
            

            '这对我有用

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-08-02
              • 2011-10-16
              • 2013-04-05
              • 1970-01-01
              • 1970-01-01
              • 2017-07-03
              相关资源
              最近更新 更多