DropDownList AppendDataBoundItems(第一项为空白且没有重复项)

时间:2009-04-08 15:34:27

标签: c# asp.net drop-down-menu webforms append

我在DropDownList内部有一个UpdatePanel,该SqlDataSourceDropDownList的回发中填充。它有一个参数是另一个控件。我有时需要多次回发,但是每次更新面板刷新时,都会将项目添加到DropDownList。因此,AppendDataBoundItems最终会导致数据不正确或重复数据。

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

我该如何克服这个问题?还有另一种方法可以让第一个项目空白吗?

(此{{1}}位于ASP.NET 2.0 Web应用程序中,代码隐藏位于C#中)

7 个答案:

答案 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>