37

我有一个DropDownList内部的 an UpdatePanel,它是在从 a 回发时填充的SqlDataSource。它有一个参数是另一个控件。我有时需要多次回发,但每次更新面板刷新时,都会将项目添加到DropDownList. 所以DropDownList最终会得到不正确的数据或重复的数据。

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

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

(这DropDownList是在 ASP.NET 2.0 Web 应用程序中,代码隐藏在 C# 中)

4

6 回答 6

65

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

<asp:DropDownList runat="server" ID="MyList"
  ondatabound="MyListDataBound"></asp:DropDownList>

然后在你的代码后面:

protected void MyListDataBound(object sender, EventArgs e)
{
    MyList.Items.Insert(0, new ListItem("- Select -", ""));
}
于 2009-04-08T15:38:37.827 回答
6

这里有很好的答案,但我觉得有必要提供更多信息,因为有多种选择可行,我们需要决定使用哪一种。

首先,我们应该了解AppendDataBoundItems。如果AppendDataBoundItems = "true",ListItems被添加到DropDownList不清除旧的。否则,DropDownList将在下一个 之前清除DataBindMSDN AppendDataBoundItems 文档

大多数答案基本上涵盖了2个选项:

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();
    }
}

注意:我喜欢检查 count 与检查的逻辑IsPostBack。虽然 PostBacks 通常是重复数据绑定的原因,但也有可能以其他方式导致它。检查项目计数基本上只是检查它是否已经加载。

或(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",它会被清除。
  • 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 -", ""));
}
于 2015-07-21T21:18:54.263 回答
4

您可能在后面的代码中绑定了那个 DropDownList。所以你不应该在再次回发后这样做:

// probably in Page_Load method
if (!Page.IsPostBack)
{
    // do data binding here
};
于 2009-12-21T19:37:51.783 回答
3

这是一个想法,我们可以使用 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();
}
于 2010-12-27T16:21:42.010 回答
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>
于 2010-04-05T17:49:29.043 回答
0

这是一个想法。

下拉列表中有一个属性,称为AutoPostBack将其设置为 true,然后在后面的代码中将所有绑定方法放在if(!Page.IsPostBack). 这对我有用。

问候。

于 2010-07-22T22:23:40.793 回答