Dropdownlist AppendDataBoundItems (erstes Element leer zu sein und keine Duplikate)
-
06-09-2019 - |
Frage
Ich habe einen DropDownList
innerhalb eines UpdatePanel
, die auf Postbacks von einem SqlDataSource
bevölkert ist. Es hat einen Parameter, der eine andere Kontrolle ist. Ich brauche manchmal mehrere Postbacks, aber was passiert, ist, dass jedes Mal, wenn der Update-Panel aktualisiert, Elemente in den DropDownList
hinzugefügt werden. So ist die DropDownList
endet Daten aufweist, die falsch ist, oder wiederholt Daten.
Ich habe die AppendDataBoundItems
Eigenschaft auf true
, weil ich das erste Element muß leer sein.
Wie kann ich dieses Problem überwinden? Gibt es eine andere Art und Weise ein leeres erstes Element zu haben?
(Diese DropDownList
ist in einer ASP.NET 2.0-Webanwendung, und Code-Behind ist in C #)
Lösung
Statt AppendDataboundItems='true'
verwenden (die das Problem Sie sprechen verursacht), reagiert auf das DataBound
Ereignis für die DropDownList
und dann „blank“ Element an die 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 -", ""));
}
Andere Tipps
Es gibt gute Antworten hier, aber ich habe das Bedürfnis, mehr Informationen enthalten, weil es mehr Optionen, die arbeiten, und wir müssen entscheiden, welche zu verwenden.
Als erstes sollten wir AppendDataBoundItems
verstehen. Wenn AppendDataBoundItems = "true"
werden ListItems
zum DropDownList
hinzugefügt, ohne die alten entrümpeln. Andernfalls wird die DropDownList
vor dem nächsten DataBind
gelöscht über. MSDN AppendDataBoundItems doc
Es gibt grundsätzlich zwei Möglichkeiten abgedeckt durch die meisten Antworten:
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
ist in html definiert -
AppendDataBoundItems="true"
-
DataBind
NICHT auf Postbacks oder wenn derDropDownList
Artikel genannt wird 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 Datenbindung sind, ist es möglich, es andere Möglichkeiten zu verursachen. Überprüfen der Elementanzahl ist grundsätzlich überprüft, um zu sehen, ob es bereits geladen worden ist.
OR (Option verwenden IsPostBack
statt)
protected void Page_Load(object sender, System.EventArgs e)
{
if (!IsPostBack) {
MyList.DataSource = MyDataSource;
MyList.DataBind();
}
}
2. Klare und laden Sie die Dropdownlist auf jeder Seite zu aktualisieren.
Hinweis 3 Unterschiede von der ersten Option:
-
AppendDataBoundItems="false"
(wenn es nicht so istfalse
definiert ist, es ist Standardwert) - Blank
ListItem
wird in Code hinter hinzugefügt. Wir können nicht in HTML definieren denn mitAppendDataBoundItems="false"
, wäre es ausgeräumt werden. -
DataBind
wird auf jedemPage_Load
genannt
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 -", ""));
}
Sie binden wahrscheinlich, dass in dem Dropdownlist-Code zurück. So sollten Sie es nach dem Postback nicht wieder tun:
// probably in Page_Load method
if (!Page.IsPostBack)
{
// do data binding here
};
Hier ist eine Idee, können wir zwei 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();
}
<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>
Hier ist eine Idee.
Es gibt eine Eigenschaft in der Dropdown-Liste AutoPostBack
setzen Sie sich auf true und dann im Code aufgerufen hinter Sie alle Bindungsmethode innerhalb des if(!Page.IsPostBack)
setzen. Das funktionierte für mich.
Bezug.
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>