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

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

我怎样才能克服这个问题?还有其他方法可以让第一项为空白吗?

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

有帮助吗?

解决方案

除了使用AppendDataboundItems='true'(这将导致你所谈论的问题)的,回应了DataBoundDropDownList事件,然后添加你的“空白”项目到列表的顶部。

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

然后,在后面的代码:

protected void MyListDataBound(object sender, EventArgs e)
{
    MyList.Items.Insert(0, new ListItem("- Select -", ""));
}

其他提示

这里有很好的答案,但我觉得需要包含更多信息,因为有多种可行的选项,我们需要决定使用哪个。

首先我们应该明白 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. 。尽管回发通常是重复数据绑定的原因,但也可能以其他方式引起。检查项目计数基本上只是检查是否已加载。

或(使用的选项 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 -", ""));
}

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

// probably in Page_Load method
if (!Page.IsPostBack)
{
    // do data binding here
};

下面是一个想法,我们可以使用2个事件:数据绑定数据绑定

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>

下面是一个想法。

有在下拉列表中称为AutoPostBack其设置为true,然后在后面的代码你把所有的绑定方法if(!Page.IsPostBack)里面的属性。这为我工作。

问候。

刚添加的的EnableViewState = “假”以下拉标签

<asp:DropDownList runat="server" ID="DropDownList1" DataSourceID="SqlDataSource" 
DataTextField="Name" DataValueField="ID" EnableViewState="false" 
AppendDataBoundItems="true">
    <asp:ListItem Value="">Select</asp:ListItem>
</asp:DropDownList>
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top