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 #)

War es hilfreich?

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 der DropDownList 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 ist false definiert ist, es ist Standardwert)
  • Blank ListItem wird in Code hinter hinzugefügt. Wir können nicht in HTML definieren denn mit AppendDataBoundItems="false", wäre es ausgeräumt werden.
  • DataBind wird auf jedem Page_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>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top