DropDownList AppendDataBoundItems(第一项空白,不重复)
我有一个DropDownList
内的UpdatePanel
从SqlDataSource
回发填充。 它有一个参数是另一个控件。 我有时需要多个回发,但会发生什么情况是每次更新面板刷新时,项目都被添加到DropDownList
。 所以DropDownList
结束了不正确的数据或重复的数据。
我将AppendDataBoundItems
属性设置为true
因为我需要第一个项目为空。
我怎样才能克服这个问题? 有没有另一种方法有一个空白的第一个项目?
(这DropDownList
是在一个asp.net-2.0的networking应用程序,而codebehind是在C#)
谢谢。
而不是使用AppendDataboundItems='true'
(这将导致您正在谈论的问题),响应DropDownList
的DataBound
事件,然后将您的“空白”项添加到列表的顶部。
<asp:DropDownList runat="server" ID="MyList" ondatabound="MyListDataBound"></asp:DropDownList>
然后在你的代码背后:
protected void MyListDataBound(object sender, EventArgs e) { MyList.Items.Insert(0, new ListItem("- Select -", "")); }
你可能在后面的代码中绑定DropDownList。 所以你不应该在回发之后再做:
// probably in Page_Load method if (!Page.IsPostBack) { // do data binding here };
这里有很好的答案,但我觉得需要包含更多的信息,因为有多个选项可以工作,我们需要决定使用哪一个。
首先,我们应该了解AppendDataBoundItems
。 如果AppendDataBoundItems = "true"
, ListItems
被添加到DropDownList
而不清除旧的。 否则, DropDownList
在下一个DataBind
之前被清除。 MSDN AppendDataBoundItems文档
大部分答案基本上有两个选项:
1.在html中定义一个空白选项,并将ListItems从数据库添加到DropDownList只需一次。
这里注意3件事情:
- 空白
ListItem
在html中定义 -
AppendDataBoundItems="true"
-
DataBind
不会在回发或DropDownList
项目计数大于1时调用
资源:
<asp:DropDownList ID="MyList" runat="server" AppendDataBoundItems="true" DataValueField="Id" DataTextField="Name" > <asp:ListItem Text="- Select One -" Value="" /> </asp:DropDownList>
代码后面:
protected void Page_Load(object sender, System.EventArgs e) { if (MyList.Items.Count <= 1 ) { MyList.DataSource = MyDataSource; MyList.DataBind(); } }
注意:我喜欢检查计数与检查IsPostBack
的逻辑。 虽然PostBacks往往是重复数据绑定的原因,但也有可能以其他方式引起。 检查项目计数基本上只是检查是否已经被加载。
或者(可以select使用IsPostBack
)
protected void Page_Load(object sender, System.EventArgs e) { if (!IsPostBack) { MyList.DataSource = MyDataSource; MyList.DataBind(); } }
2.清除并重新加载每个页面上的DropDownList刷新。
注意3与第一个选项的区别:
-
AppendDataBoundItems="false"
(如果没有定义,那么false
是默认值) - 空白
ListItem
被添加在后面的代码中。 我们不能在html中定义它,因为AppendDataBoundItems="false"
,它将被清除。 - 每个
Page_Load
都会调用DataBind
资源:
<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 -", "")); }
这里有一个想法,我们可以使用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(); }
<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>
代码的作品,试图给它一个价值:
MyList.Items.Insert(0, new ListItem("- Select -", "0"));
这是一个想法。
在下拉列表中有一个名为AutoPostBack
的属性,将其设置为true,然后在后面的代码中将所有绑定方法放在if(!Page.IsPostBack)
。 这对我有效。
问候。
只需将EnableViewState =“false”添加到下拉列表标记
<asp:DropDownList runat="server" ID="DropDownList1" DataSourceID="SqlDataSource" DataTextField="Name" DataValueField="ID" EnableViewState="false" AppendDataBoundItems="true"> <asp:ListItem Value="">Select</asp:ListItem> </asp:DropDownList>