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

zoh*_*air 35 c# asp.net webforms append drop-down-menu

我有一个DropDownList内部版本UpdatePanel,填充在回发中SqlDataSource.它有一个参数是另一个控件.我有时需要多个回发,但是每次更新面板刷新时都会发生这样的事情DropDownList.因此DropDownList最终会产生不正确的数据或重复的数据.

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

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

(这DropDownList是在asp.net-2.0网络应用程序中,代码隐藏在c#中)

谢谢.

Kel*_*tex 62

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

<asp:DropDownList runat="server" ID="MyList"
  ondatabound="MyListDataBound"></asp:DropDownList>
Run Code Online (Sandbox Code Playgroud)

然后在你的代码后面:

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


Ton*_* L. 5

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

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

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

1.在html中定义一个空白选项,并将ListItems从数据库添加到DropDownList仅一次。

注意这里的三件事:

  • 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>
Run Code Online (Sandbox Code Playgroud)

后面的代码:

protected void Page_Load(object sender, System.EventArgs e)
{
    if (MyList.Items.Count <= 1 ) {
        MyList.DataSource = MyDataSource;
        MyList.DataBind();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

或(改为使用的选项IsPostBack

protected void Page_Load(object sender, System.EventArgs e)
{
    if (!IsPostBack) {
        MyList.DataSource = MyDataSource;
        MyList.DataBind();
    }
}
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

后面的代码:

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 -", ""));
}
Run Code Online (Sandbox Code Playgroud)