2009-04-08 28 views
35

我有一個DropDownListUpdatePanel是從SqlDataSource回發填充。它有一個參數是另一個控件。我有時需要多次回發,但會發生什麼情況是,每次更新面板刷新時,項目都會添加到DropDownList。因此,DropDownList最終導致數據不正確或重複數據。DropDownList AppendDataBoundItems(第一項空白,沒有重複)

我將AppendDataBoundItems屬性設置爲true,因爲我需要將第一項空白。

我該如何克服這個問題?有沒有另一種方法可以有一個空白的第一個項目?

(這DropDownList是一個asp.net-2.0的Web應用程序,並且代碼隱藏在C#)

謝謝。

回答

61

而不是使用AppendDataboundItems='true'(這會導致您正在談論的問題),迴應的DataBound事件,然後將「空白」項添加到列表頂部。

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

然後在後面的代碼:

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

謝謝.. !!它幫助 – msbyuva 2010-08-10 17:36:52

+0

Thnx!像魅力一樣工作 – matskn 2012-08-10 10:52:53

0

代碼工作,儘量給它一個值:

MyList.Items.Insert(0, new ListItem("- Select -", "0")); 
4

你可能是綁定的DropDownList後面的代碼中。所以,你不應該再這樣做回發後:

// probably in Page_Load method 
if (!Page.IsPostBack) 
{ 
    // do data binding here 
}; 
1
<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> 
0

這裏有一個想法。

在下拉列表中有一個名爲AutoPostBack的屬性,將其設置爲true,然後在代碼後面將所有綁定方法放入if(!Page.IsPostBack)。這對我有效。

關於。

2

這裏有一個想法,我們可以使用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(); 
} 
3

這裏還有很好的答案,但我覺得有必要包括更多的信息,因爲有多個選項,工作,我們需要決定使用哪個。

首先,我們應該瞭解AppendDataBoundItems。如果AppendDataBoundItems = "true",ListItems被添加到DropDownList而不清除舊的。否則,DropDownList在下一個DataBind之前被清除。 MSDN AppendDataBoundItems doc

基本上有大多數的答案涉及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> 

後面的代碼:

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

注:我喜歡檢查計數VS檢查IsPostBack的邏輯。雖然PostBacks通常是重複數據綁定的原因,但可以通過其他方式進行。檢查項目計數基本上只是檢查它是否已被加載。

OR(選項可使用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 -", "")); 
} 
0

只需添加的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>