DropDownList AppendDataBoundItems(第一项空白,不重复)

我有一个DropDownList内的UpdatePanelSqlDataSource回发填充。 它有一个参数是另一个控件。 我有时需要多个回发,但会发生什么情况是每次更新面板刷新时,项目都被添加到DropDownList 。 所以DropDownList结束了不正确的数据或重复的数据。

我将AppendDataBoundItems属性设置为true因为我需要第一个项目为空。

我怎样才能克服这个问题? 有没有另一种方法有一个空白的第一个项目?

(这DropDownList是在一个asp.net-2.0的networking应用程序,而codebehind是在C#)

谢谢。

而不是使用AppendDataboundItems='true' (这将导致您正在谈论的问题),响应DropDownListDataBound事件,然后将您的“空白”项添加到列表的顶部。

 <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个事件: DataBoundDataBinding

 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>