如何在此方案中避免重复绑定项目:
页面上有一个数据绑定控件(在这种情况下是一个DropDownList,虽然我觉得不重要)。它将AppendDataBoundItems设置为“true”。在代码的某处,设置了一个DataSource并调用了DataBind。所以这个控制是明确约束的。
您还需要在页面上绑定其他一些内容,因此请调用Page.DataBind。
您的数据绑定控件现在包含重复项。它是(1)显式绑定,然后(2)Page.DataBind再次绑定它。由于AppendDataBoundItems为true,第二个绑定会附加到第一个绑定,最后会有两倍的项目。
一些限制:
对控件的DataBind的显式调用是通过一些集中式代码完成的,并且很难改变。
我真的需要聚合页面的其余部分(通过Page.Databind()),因为有太多的其他数据绑定元素可以单独执行,而无需编写大量的单独调用。
< / LI> 醇>我需要一个像... Page.DataBindExceptIfTheyHaveAlreadyBeenBoundDuh()
这样的方法答案 0 :(得分:5)
执行Control.DataBind()后关闭AppendDataBoundItems。然后,Page.DataBind()不会再次附加项目。
DropDownList.DataSource = Data;
DropDownList.DataBind();
DropDownList.AppendDataBoundItems = false;
答案 1 :(得分:4)
最重要的是,没有很好的解决方案。您需要构建页面,以便它们不会将控件绑定两次,这意味着必要时重写页面的一部分。这种痛苦比解决方法更好。
答案 2 :(得分:4)
您可以将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);
}
答案 3 :(得分:1)
我过去曾多次遇到这个问题,而且我发现的最佳解决方案几乎适用于我所拥有的所有情况;是使用UNION选择-1作为值,' - 选择 - '作为文本。
即使您在网格中有网格并将数据绑定到该内部网格中的用户控件中的下拉列表,这也会起作用。
使用代码隐藏来加载网格将不允许数据绑定到usercontrol字段。
我希望这个提示有帮助...
答案 4 :(得分:0)
通常,当您不希望进行太多更改而破坏页面/控件的其余部分时,会在遗留代码中发生这种情况。在某些情况下使用下拉列表,您可能需要清除dropdownlist.databinding事件中的项目作为快速修复。
protected void DropDownList1_DataBinding(object sender, EventArgs e)
{
if((sender as DropDownList).Items.Count > 0)
{
(sender as DropDownList).Items.Clear();
}
}
注意:如果项目值发生变化,您应该小心这样做。
答案 5 :(得分:0)
我在asp.net中从mysql数据库中检索值时遇到过这种情况。在autopostback上,值被添加到下拉列表中已存在的值。
溶液: 我有一个sqlcommand来首先计算数据库表中相关的行数。并将值存储在Intvariable1
中然后宣布另一个intVariable。
session("intvariable")=Dropdownlist1.items.count
while session("intvariable") > session("intvariable1")
Dropdownlist1.items.removeAt(Session("intvariable")-1)
session("intvariable)-=1
End while
'这对我有用