web-dev-qa-db-ger.com

DropDownList AppendDataBoundItems (erstes leeres Element und keine Duplikate)

Ich habe eine DropDownList in einer UpdatePanel, die beim Postback von einer SqlDataSource ausgefüllt wird. Es hat einen Parameter, der ein anderes Steuerelement ist. Ich brauche manchmal mehrere Postbacks, aber was passiert ist, dass bei jeder Aktualisierung des Aktualisierungsfensters Elemente zur DropDownList hinzugefügt werden. Die DropDownList hat am Ende falsche oder wiederholte Daten.

Ich habe die AppendDataBoundItems-Eigenschaft auf true gesetzt, da das erste Element leer sein muss. 

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

(Diese DropDownList befindet sich in einer asp.net-2.0-Web-App und codebehind in c #.)

Vielen Dank.

35
zohair

Reagieren Sie anstelle von AppendDataboundItems='true' (was zu dem Problem führt, über das Sie sprechen) auf das DataBound-Ereignis für die DropDownList und fügen Sie dann das "leere" Element oben in der Liste hinzu.

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

Dann in deinem Code hinter:

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

Hier gibt es gute Antworten, aber ich hatte das Bedürfnis, mehr Informationen einzufügen, da es mehrere Optionen gibt, die funktionieren und wir entscheiden müssen, welche Verwendung sie haben.

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

Es gibt grundsätzlich zwei Optionen, die von den meisten Antworten abgedeckt werden:

1. Definieren Sie eine leere Option in html und fügen Sie die ListItems aus der Datenbank nur einmal zur DropDownList hinzu.

Beachten Sie 3 Dinge hier:

  • Leer ListItem ist in HTML definiert
  • AppendDataBoundItems="true"
  • DataBind wird NICHT für Postbacks aufgerufen oder wenn der DropDownList-Eintrag Count> 1 ist

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 der Überprüfung der Zählung im Vergleich zur Überprüfung von _ IsPostBack. Obwohl PostBacks oft die Ursache für doppelte Datenbindungen sind, ist es möglich, dass dies auf andere Weise geschieht. Bei der Überprüfung der Elementanzahl wird im Grunde nur geprüft, ob sie bereits geladen ist.

ODER (Option, stattdessen IsPostBack zu verwenden)

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

2. Löschen und laden Sie die DropDownList bei jeder Seitenaktualisierung neu.

Beachten Sie 3 Unterschiede zur ersten Option:

  • AppendDataBoundItems="false" (wenn es nicht definiert ist, ist false der Standardwert )
  • Leerzeichen ListItem wird hinter dem Code hinzugefügt. Wir können es nicht in html Definieren, da es mit AppendDataBoundItems="false" gelöscht werden würde. 
  • DataBind wird bei jedem Page_Load aufgerufen

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 -", ""));
}
4
Tony L.

Sie binden diese DropDownList wahrscheinlich im Code dahinter. Du solltest es also nicht mehr nach dem Postback machen:

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

Hier ist eine Idee, wir können 2 Ereignisse verwenden: 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();
}
2
Terminator
<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>
1
bagher

Hier ist eine Idee.

Es gibt eine Eigenschaft in der Dropdown-Liste mit dem Namen AutoPostBack, die auf true gesetzt ist. Anschließend wird im Code hinter dem Code die gesamte Bindungsmethode in if(!Page.IsPostBack) eingefügt. Das hat bei mir funktioniert.

grüße.

0
Miguel

Der Code funktioniert, versuchen Sie ihm einen Wert zu geben:

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

Fügen Sie einfach EnableViewState = "false" dem Dropdown-Tag hinzu

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