2009-04-08 17 views
35

Ich habe eine DropDownList innerhalb einer UpdatePanel, die auf Postback von SqlDataSource aufgefüllt wird. Es hat einen Parameter, der ein anderes Steuerelement ist. Ich brauche manchmal mehrere Postbacks, aber was passiert, ist, dass jedes Mal, wenn das Update-Panel aktualisiert wird, Elemente zur DropDownList hinzugefügt werden. So die DropDownList endet mit Daten, die falsch sind, oder wiederholte Daten.DropDownList AppendDataBoundItems (das erste Element leer und keine Duplikate)

Ich habe die AppendDataBoundItems Eigenschaft auf true eingestellt, weil ich das erste Element leer sein muss.

Wie kann ich dieses Problem lösen? Gibt es eine andere Möglichkeit, einen leeren ersten Artikel zu haben?

(Diese DropDownList ist in einem asp.net-2.0-Web-App und Code-Behind ist in C#)

Danke.

Antwort

61

Anstelle der Verwendung von AppendDataboundItems='true' (die das Problem verursacht Sie sprechen), reagieren auf die DataBound Ereignis für die DropDownList und dann „blank“ Element an der Spitze der Liste hinzuzufügen.

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

Dann im Code hinter:

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

Danke .. !! Es half – msbyuva

+0

Thnx! funktioniert wie ein Zauber – matskn

+0

Bin ich die einzige Person, die ein Problem mit OnDataBound hat, das die Methode findet, zu der Sie sie erklärt haben? Es scheint nicht im hinteren Teil des Codes zu suchen (Trotz der Tatsache, dass die gesamte DropDownList dort gefüllt und erstellt wird.) –

0

Der Code funktioniert, versuchen Sie es um einen Wert zu geben:

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

Sie wahrscheinlich, dass in der Dropdownlist Code hinter binden. So sollten Sie es nicht wieder nach dem Postback tun:

// 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

Hier ist eine Idee.

Es gibt eine Eigenschaft in der Dropdown-Liste namens AutoPostBack setzen Sie es auf wahr und dann in den Code hinter Ihnen setzen Sie die gesamte Bindungsmethode in die if(!Page.IsPostBack). Das hat für mich funktioniert.

grüße. Hier

2

ist eine Idee, wir zwei Ereignisse verwenden können: Databound und 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(); 
} 
+0

Das Löschen der Liste in der MyListDataBinding-Funktion entspricht im Grunde der Einstellung von AppendDataBoundItems = "false". –

3

Es gibt gute Antworten hier, aber ich hatte das Bedürfnis, mehr Informationen zu enthalten, da es mehrere Optionen, die arbeiten und wir müssen entscheiden, was zu verwenden ist.

Zuerst sollten wir AppendDataBoundItems verstehen. Wenn AppendDataBoundItems = "true", ListItems zu DropDownList hinzugefügt werden, ohne die alten zu löschen. Ansonsten wird die DropDownList etwa vor der nächsten DataBind gelöscht. MSDN AppendDataBoundItems doc

Es gibt grundsätzlich 2 durch die meisten Antworten abgedeckt Optionen:

1. Definieren Sie eine leere Option in HTML und fügen Sie die Listitems aus der Datenbank der Dropdown nur einmal.

Hinweis 3 Dinge hier:

  • Blank ListItem in html definiert ist
  • AppendDataBoundItems="true"
  • DataBind wird NICHT auf Postbacks genannt, oder wenn die DropDownList Artikel Zählung> 1

Quelle:

<asp:DropDownList ID="MyList" runat="server" AppendDataBoundItems="true" DataValueField="Id" DataTextField="Name" > 
    <asp:ListItem Text="- Select One -" Value="" /> 
</asp:DropDownList> 

-Code hinter:

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

Hinweis: Ich mag die Logik die Zählerprüfung vs IsPostBack überprüfen. Obwohl PostBacks oft die Ursache für doppelte Databinding sind, ist es möglich, es auf andere Arten zu verursachen. Wenn Sie die Anzahl der Objekte überprüfen, prüfen Sie einfach, ob sie bereits geladen wurde.

OR (Option IsPostBack stattdessen verwenden)

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

2. Klare und die Dropdownlist auf jeder Aktualisierung der Seite neu zu laden.

Hinweis 3 Unterschiede von der ersten Option:

  • AppendDataBoundItems="false" (wenn es nicht dann false definiert ist, es ist Standardwert)
  • Blank ListItem hinter in Code hinzugefügt wird. Wir können es nicht in html definieren, weil mit AppendDataBoundItems="false" würde es gelöscht werden.
  • DataBind ist auf jeder Page_Load

Quelle:

<asp:DropDownList ID="MyList" runat="server" DataValueField="Id" DataTextField="Name" 
    OnDataBound="MyList_DataBound" > 
</asp:DropDownList> 

-Code hinter:

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

Just Add EnableViewState = "false" auf den Dropdown-Tag

<asp:DropDownList runat="server" ID="DropDownList1" DataSourceID="SqlDataSource" 
DataTextField="Name" DataValueField="ID" EnableViewState="false" 
AppendDataBoundItems="true"> 
    <asp:ListItem Value="">Select</asp:ListItem> 
</asp:DropDownList> 
Verwandte Themen