Domanda

Ho un DropDownList all'interno di un UpdatePanel che è popolata da un postback SqlDataSource.È un parametro che è un altro controllo.A volte ho bisogno di più postback, ma quello che succede è che ogni volta che il pannello di aggiornamento aggiorna, gli elementi vengono aggiunti all' DropDownList.Così il DropDownList finisce per avere dei dati che non è corretto, o di dati ripetuti.

Ho l' AppendDataBoundItems set di proprietà di true perché ho bisogno di il primo elemento a essere vuoto.

Come posso superare questo problema?C'è un altro modo di avere un vuoto prima voce?

(Questo DropDownList è in un ASP.NET web 2.0, app, e codebehind è in C#)

È stato utile?

Soluzione

Invece di usare AppendDataboundItems='true' (che farà sì che il problema si sta parlando), rispondere all'evento DataBound per la DropDownList e quindi aggiungere il vostro articolo "in bianco" in cima alla lista.

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

Poi nel codice dietro:

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

Altri suggerimenti

Ci sono buone risposte qui, ma ho sentito il bisogno di includere ulteriori informazioni perché ci sono diverse opzioni che funzionano e dobbiamo decidere quale utilizzare.

In primo luogo, dobbiamo capire AppendDataBoundItems. Se AppendDataBoundItems = "true", ListItems sono aggiunti alla DropDownList senza cancellare i vecchi. In caso contrario, il DropDownList viene cancellato circa prima del prossimo DataBind. MSDN AppendDataBoundItems doc

Ci sono fondamentalmente 2 opzioni coperti dalla maggior parte delle risposte:

1. Definire un opzione vuota in html e aggiungere le ListItems dal database per la DropDownList solo una volta.

Nota 3 cose qui:

  • ListItem vuoto è definito in html
  • AppendDataBoundItems="true"
  • DataBind NON è chiamato postback o quando l'elemento DropDownList count è> 1

Fonte:

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

Codice dietro:

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

Nota: mi piace la logica del controllo del conteggio vs controllo IsPostBack. Anche se postback sono spesso la causa di associazione dati duplicati, è possibile causare altri modi. Verifica del conteggio oggetto è fondamentalmente solo controllo per vedere se è già stato caricato.

O (possibilità di utilizzare IsPostBack invece)

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

2. Chiaro e ricaricare il DropDownList su ogni refresh della pagina.

Nota 3 differenze rispetto alla prima opzione:

  • AppendDataBoundItems="false" (se non è definito, allora è false è valore di default)
  • ListItem vuoto viene viene aggiunto in codice dietro. Non possiamo definirlo in html perché con AppendDataBoundItems="false", sarebbe sgomberato.
  • DataBind viene chiamato su ogni Page_Load

Fonte:

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

Codice dietro:

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 -", ""));
}

Si associa probabilmente che DropDownList nel codice dietro. Quindi non si dovrebbe farlo dopo il postback di nuovo:

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

Ecco un'idea, possiamo usare 2 eventi: DataBound e 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>

Ecco un'Idea.

C'è una proprietà nell'elenco a discesa chiamato AutoPostBack impostare a true e quindi nel codice dietro si mettono tutti il metodo di associazione all'interno della if(!Page.IsPostBack).Che ha funzionato per me.

per quanto riguarda.

Just Add EnableViewState = "false" al tag discesa

<asp:DropDownList runat="server" ID="DropDownList1" DataSourceID="SqlDataSource" 
DataTextField="Name" DataValueField="ID" EnableViewState="false" 
AppendDataBoundItems="true">
    <asp:ListItem Value="">Select</asp:ListItem>
</asp:DropDownList>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top