Come gestire vincolante di uno SqlDataSource a due vie su un ListBox ASP.NET
-
22-09-2019 - |
Domanda
Se ho due caselle di riepilogo, con un pulsante tra di loro, come faccio aggiornare gli elementi di ListBox2 se gli elementi di ListBox2 sono databound?
<asp:ListBox runat="server" ID="ListBox1" DataSourceID="DataSource1"
DataTextField="Name" DataValueField="ID" SelectionMode="Multiple" />
<asp:Button runat="server" ID="addButton" onClick="addButton_Click" />
<asp:ListBox runat="server" ID="ListBox2" DataSourceID="DataSource2"
DataTextField="Name" DataValueField="ID" SelectionMode="Multiple" />
Anche se uso il SelectionMode = "Multiple", sarò in grado di aggiornare il DataSource utilizzando un UpdateCommand che prende un elemento alla volta?
EDIT:
Ok, per aggiungere qualche precisazione:
- I due listboxes sono DataBound di dati univoci (SqlDataSource).
- Voglio aggiungere elementi da ListBox1 a ListBox2 e viceversa, quando un utente fa clic su un pulsante.
- Voglio essere in grado di aggiungere più elementi alla ListBox (presumere che la selezione multipla è attivata)
- Voglio che per attivare un UpdateCommand sul DataSource.
Finora l'unico modo in cui sono in grado di raggiungere questo obiettivo è quello di prendere manualmente ciascun elemento dalla prima ListBox e aggiungendo come parametro per UpdateCommand del DataSource e manualmente chiamare il metodo SqlDataSource.Update (). Questo funziona, ma significa che Mi sia bisogno di passare una stringa delimitata per più selezioni o aprire connessioni multiple. Quello che sto cercando è un modo per aggiornare il DataSource sulla ListBox e una volta che è completamente aggiornato, quindi chiamare il Bind / Update e persistono i dati al DB.
Soluzione
La prima domanda è sono gli elementi che si desidera aggiungere che sono al di fuori del DataSource binded statico o dinamico. Se si dispone di un paio di elementi che si desidera aggiungere che sarà sempre lo stesso, come un'opzione "None", quindi è possibile aggiungere nella vostra ASP come ListItem e impostare la proprietà AppendToDataSource su True.
Se si desidera inserire dinamicamente i valori insieme ai valori databound, allora è possibile impostare il valore DataSource a una funzione C # e non impostare il DataSourceID. Si sarebbe simile a questa.
<asp:ListBox runat="server" ID="ListBox2" DataSource='<%# myFunc() %>'
DataTextField="Name" DataValueField="ID" SelectionMode="Multiple" />
Poi, nel C # codefile avete
protected ListItem[] myFunc()
{
ListItem[] retVals;
//write your code here to get your data from DataSource2 and whatever other sources you need
//then create a ListItem for each row of data you want to show,
//set the text and the value attributes and return an array of all the values in the order you want
return retVals;
}
Questo vi permetterà di tenere qualsiasi funzionalità chiamata DataBind si può avere già sviluppato in quanto questa funzione verrà chiamato ogni volta che il metodo DataBind dell'oggetto è chiamato.
Altri suggerimenti
Aggiungi un gestore di eventi per l'evento DataBound di ListBox2. Che attiverà dopo che i dati di SQL è legato e vi darà l'opportunità di aggiungere dati aggiuntivi.
Non è importante che il vostro listbox binded a un DataContext o non si dovrebbe usare
ListBox1.Items.Add(/*your listBox Item*/);// for example if you have a person listbox you should have - ListBox1.Items.Add(new Person(1,"Nasser","Hajloo");
Ricordate solo che si dovrebbe aggiungere elementi dopo il legame voglio dire
ListBox1.DataSource = myDBList;
ListBox1.DataBind();
//some other code
ListBox1.Items.Add(new Person(1,"Nasser","Hajloo");
ListBox1.DataBind();