我在DropDownList
内部有一个UpdatePanel
,该SqlDataSource
在DropDownList
的回发中填充。它有一个参数是另一个控件。我有时需要多次回发,但是每次更新面板刷新时,都会将项目添加到DropDownList
。因此,AppendDataBoundItems
最终会导致数据不正确或重复数据。
我将true
属性设置为DropDownList
因为我需要第一个项目为空白。
我该如何克服这个问题?还有另一种方法可以让第一个项目空白吗?
(此{{1}}位于ASP.NET 2.0 Web应用程序中,代码隐藏位于C#中)
答案 0 :(得分:62)
而不是使用AppendDataboundItems='true'
(这会导致您正在讨论的问题),而是回复DataBound
的{{1}}事件,然后将“空白”项添加到顶部列表。
DropDownList
然后在你的代码背后:
<asp:DropDownList runat="server" ID="MyList"
ondatabound="MyListDataBound"></asp:DropDownList>
答案 1 :(得分:5)
这里有很好的答案,但我觉得需要包含更多信息,因为有多个选项可行,我们需要决定使用哪些。
首先,我们应该了解AppendDataBoundItems
。如果AppendDataBoundItems = "true"
,ListItems
已添加到DropDownList
而未清除旧版DropDownList
。否则,DataBind
会在下一个ListItem
之前清除。 MSDN AppendDataBoundItems doc
大多数答案基本上涵盖了两个选项:
<强> 1。在html中定义一个空白选项,并将ListItems从数据库添加到DropDownList只有一次。
请注意以下3件事:
AppendDataBoundItems="true"
在html DataBind
DropDownList
不会在回发或<asp:DropDownList ID="MyList" runat="server" AppendDataBoundItems="true" DataValueField="Id" DataTextField="Name" >
<asp:ListItem Text="- Select One -" Value="" />
</asp:DropDownList>
项目时调用
count是&gt; 1 来源:
protected void Page_Load(object sender, System.EventArgs e)
{
if (MyList.Items.Count <= 1 ) {
MyList.DataSource = MyDataSource;
MyList.DataBind();
}
}
代码背后:
IsPostBack
注意:我喜欢检查计数与检查IsPostBack
的逻辑。虽然PostBacks通常是重复数据绑定的原因,但它可能会以其他方式引起它。检查项目计数基本上只是检查它是否已经加载。
OR(改为使用protected void Page_Load(object sender, System.EventArgs e)
{
if (!IsPostBack) {
MyList.DataSource = MyDataSource;
MyList.DataBind();
}
}
的选项)
AppendDataBoundItems="false"
<强> 2。清除并在每次刷新页面时重新加载DropDownList。
注意与第一个选项的3个不同之处:
false
(如果未定义,那么ListItem
就是它
默认值)AppendDataBoundItems="false"
。我们无法在html中定义它
因为DataBind
,它会被清除掉。 Page_Load
都会调用<asp:DropDownList ID="MyList" runat="server" DataValueField="Id" DataTextField="Name"
OnDataBound="MyList_DataBound" >
</asp:DropDownList>
来源:
protected void Page_Load(object sender, System.EventArgs e)
{
MyList.DataSource = MyDataSource;
MyList.DataBind();
}
protected void MyList_DataBound(object sender, EventArgs e)
{
MyList.Items.Insert(0, new ListItem("- Select One -", ""));
}
代码背后:
$(document).on("click", "#hyperLink", function () {
$("#divSection").dialog({
title: "User Details",
resizable: false,
autoOpen: false,
height: 'auto',
width: 300,
appendTo: "form"
});
});
答案 2 :(得分:4)
您可能将DropDownList绑定在后面的代码中。所以你不应该在回发后再这样做:
// probably in Page_Load method
if (!Page.IsPostBack)
{
// do data binding here
};
答案 3 :(得分:3)
这是一个想法,我们可以使用2个事件: DataBound 和 DataBinding :
protected void MyListDataBound(object sender, EventArgs e)
{
MyList.Items.Insert(0, new ListItem("- Select -", ""));
}
protected void MyListDataBinding(object sender, EventArgs e)
{
MyList.Items.Items.Clear();
}
答案 4 :(得分:0)
<asp:DropDownList ID="DropDownList1" AppendDataBoundItems="true" runat="server"
DataSourceID="SqlDataSource1" DataTextField="state" DataValueField="state">
<asp:ListItem Text="(Select a State)" Value="" />
</asp:DropDownList>
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$ ConnectionStrings:pubsConnectionString %>"
SelectCommand="SELECT DISTINCT [state] FROM [authors]">
</asp:SqlDataSource>
答案 5 :(得分:0)
这是一个想法。
下拉列表中有一个名为AutoPostBack
的属性将其设置为true,然后在后面的代码中将所有绑定方法放在if(!Page.IsPostBack)
中。这对我有用。
问候。
答案 6 :(得分:-1)
只需将 EnableViewState =“false”添加到Dropdown标记
<asp:DropDownList runat="server" ID="DropDownList1" DataSourceID="SqlDataSource"
DataTextField="Name" DataValueField="ID" EnableViewState="false"
AppendDataBoundItems="true">
<asp:ListItem Value="">Select</asp:ListItem>
</asp:DropDownList>