Aggiungere Listitem a Dropdownlist collegato a datasource

venerdì 15 luglio 2011 - 13.50
Tag Elenco Tags  VB.NET  |  .NET 4.0  |  Visual Studio Express  |  SQL Server 2005

matteoct Profilo | Junior Member

Salve, premetto che da poco utilizzo ASP.NET - linguaggio VB.

Ho questa necessità: In un Detailsview ho inserito una Dropdownlist collegata ad un Datsource e funziona correttamente. Il problema è che prima dei dati estratti dal datasource dovrei aggiungere manualmente un listitem con dei dati dinamici, ovvero i valori di 2 sessioni precedentemente create, ma ricevo questo errore:

Messaggio di errore del parser: Il contenuto in formato letterale ('<asp:ListItem Text="') non è consentito in un 'System.Web.UI.WebControls.ListItemCollection'

Se invece aggiungo manualmente il listitem con dei dati statici funziona correttamente.
di seguito posto il codice utilizzato per dropdownlist:

<asp:DropDownList ID="DropDownList3" runat="server"
DataSourceID="SqlDataSource5" DataTextField="azienda"
DataValueField="idazienda"
AppendDataBoundItems="true">
<asp:ListItem Text="<%=session("idutente") %>" Value="<%=session("utente")"></asp:ListItem>
</asp:DropDownList>
<asp:SqlDataSource ID="SqlDataSource5" runat="server"
ConnectionString="<%$ ConnectionStrings:webapplicationConnectionString %>"
SelectCommand="SELECT * FROM [AZIENDE]"></asp:SqlDataSource>

l'errore si verifica nella riga perchè non mi fa inserire valori dinamici:
<asp:ListItem Text="<%=session("idutente") %>" Value="<%=session("utente")"></asp:ListItem>

Grazie in anticipo, saluti

alx_81 Profilo | Guru

>Salve, premetto che da poco utilizzo ASP.NET - linguaggio VB.
Ciao e benvenuto su dotnethell.it!

>Ho questa necessità: In un Detailsview ho inserito una Dropdownlist
>collegata ad un Datsource e funziona correttamente. Il problema
>è che prima dei dati estratti dal datasource dovrei aggiungere
>manualmente un listitem con dei dati dinamici, ovvero i valori
>di 2 sessioni precedentemente create, ma ricevo questo errore:
>Messaggio di errore del parser: Il contenuto in formato letterale
>('<asp:ListItem Text="') non è consentito in un 'System.Web.UI.WebControls.ListItemCollection'
>Se invece aggiungo manualmente il listitem con dei dati statici
>funziona correttamente.
ti consiglio di andare ad intervenire manualmente sul binding della dropdownlist senza collegare il datasource da asp.net.
Quello che intendo è usare direttamente VB.Net lato server con ADO.Net. Leggere i dati da database, creare un tuo oggetto (ad esempio un datatable, o una IList) con l'elemento che vuoi aggiungere e poi legare al dropdownlist quell'oggetto. Il tutto da codice lato server..

>Grazie in anticipo, saluti
di nulla!
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

Gluck74 Profilo | Guru

puoi lasciare tranquillamente il SqlDataSource, solo fai queste piccole modifiche:
1 - Togli <asp:ListItem /> dalla pagina aspx
2 - nel codice metti
protected void Page_Load(object sender, EventArgs e) { DropDownList3.Items.Add(new ListItem("testo", "VALORE")); }

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

alx_81 Profilo | Guru

>puoi lasciare tranquillamente il SqlDataSource, solo fai queste
>piccole modifiche:
>1 - Togli <asp:ListItem /> dalla pagina aspx
>2 - nel codice metti
>
> protected void Page_Load(object sender, EventArgs e)
> {
>DropDownList3.Items.Add(new ListItem("testo", "VALORE"));
> }
Ok, però non trovi che sia meglio fornire un livello di astrazione sulla sorgente dati? Così è molto legata al controllo e se volessi replicare la logica per più drop down forse è meglio fare un "metodo" da cui mi tornano sempre quei dati. Che ne dici?
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

Gluck74 Profilo | Guru

sicuramente molto meglio.

rispondendo cerco di attenermi sempre a quello che già è stato fatto. Se dovessi, per ognuno che scrive qui, spiegargli di astrarre la sorgente dati, quindi togliere il SqlDataSource, bla, bla, bla, bla..........

stiamo freschi.
Certo che è un buon consiglio, ma non credo sia lo scopo di un forum insegnare a programmare, ma rispondere a quesiti

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

alx_81 Profilo | Guru

>Certo che è un buon consiglio, ma non credo sia lo scopo di un
>forum insegnare a programmare, ma rispondere a quesiti
ok, non condivido appieno la tua idea, tuttavia capisco quello che intendi.
Diciamo che preferisco sempre dare il consiglio migliore che mi viene in mente, in base anche all'esperienza che ho (seppur poca in certi ambiti ), anche se a volte questa cosa porta a ripensare le cose.
Preferisco fare in modo che si notino certe cose che magari, vuoi per inesperienza, vuoi per mancanza di capacità di reperire documentazione, vuoi per difficoltà implementative, non si conoscono.
Tutto qui, comunque ovviamente poi ognuno è liberissimo di seguire la strada che vuole tra quelle indicate da tutti noi.
E di certo, per tutti noi, c'è sempre da imparare, anche risolvendo in maniera diversa dal solito i problemi.

Ciao!
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

matteoct Profilo | Junior Member

Intanto grazie e sono onorato di aver recevuto risposte da due esperti come voi (ho appreso molto dai vostri consigli in vari forum e siti) e ve ne do atto pubblicamente.

Tornando al problema, avevo già provato il consiglio di Gluck74, ma purtoppo non funziona e credo perchè il dorpdownlist è incluso nel Detailsview.
Infatti se creo un nuovo dropdownlist fuori dl codice del Detailsview funziona, mentre nel mio caso no e ricevo questo errore:

Messaggio di errore del compilatore: BC30451: 'DropDownList3' non dichiarato. Potrebbe non essere accessibile a causa del relativo livello di protezione.

Tuttavia avevo già pensato anche a quanto consigliato da alx_81, che in questo caso credo sia la scelta più appropriata ma, non disponendo di esempi, non ho avuto ancora tempo per fare delle prove. Pertanto adesso proverò a documentarmi su quanto consigliato da alx_81.

Ancora grazie, saluti

alx_81 Profilo | Guru

>Tuttavia avevo già pensato anche a quanto consigliato da alx_81,
>che in questo caso credo sia la scelta più appropriata ma, non
>disponendo di esempi, non ho avuto ancora tempo per fare delle
>prove. Pertanto adesso proverò a documentarmi su quanto consigliato
>da alx_81.
Se prendi la query che hai scritto nel SQLDataSource5, dovrai usare ADO.Net per chiamare il database.
Un esempio di chiamata è la seguente (non ho VB installato, ho usato LINQPad):


Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

una cosa del genere..
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

matteoct Profilo | Junior Member

Ciao Alessandro e grazie per la risposta.
Ho eseguito il codice che mi hai postato ma ancora non funziona. Non riesco a capire dove e cosa sbaglio.
Quando eseguo la pagina, non visualizzo alcuna dropdownlist, sia se aggiungo il codice nell'EditItemTemplate, sia in un punto qualsiasi della pagina, e ricevo questo errore (compare in alto nella pagina): System.Web.UI.WebControls.DropDownList

Questo è il mio codice (che eseguo nella pagina aspx e non in aspx.vb, perchè il dropdownlist devo inserirlo in un EditItemTemplate):
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

alx_81 Profilo | Guru

>Ciao Alessandro e grazie per la risposta.
>Ho eseguito il codice che mi hai postato ma ancora non funziona.
>Non riesco a capire dove e cosa sbaglio.
Allora, se tu quel dropdownlist lo devi aggiungere solo in editing, devi andare a collegare i dati solo quando lo aggiungi.
Quindi devi gestire l'evento in cui vai a passare da uno stato "di lettura" a quello di "editing".
Il DetailsView ha questo evento da gestire:
http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.detailsview.modechanged.aspx

Noterai la proprietà CurrentMode che può anche valere EDIT. In tal caso, esegui il codice che ti ho dato e fai il binding del controllo.
Così dovrebbe andare.
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

matteoct Profilo | Junior Member

Ho seguito i tuoi consigli, ma purtroppo non ho risolto ancora.

Con il codice di seguito riportato, fuori dalla parte "EditItemTemplate" la dropdownlist funziona correttamente, mentre, nella parte di codice relativa a "EditItemTemplate" del Detailview, ho fatto queste due prove con esito negativo:
1. Ho inserito il codice (quello funzionante) nella pagina aspx, tra i tag <EditItemTemplate> e </EditItemTemplate> ma la pagina va in errore immediatamente perchè è evidenziato che la dropdownlist non è dichiarata. Allora l'ho dichiarata da codice, ad es. Dim dropdownlist3 As New DropDownList, ma quando mando in esecuzione la pagina la dropdownlist3 non visualizza nulla. La dropdownlist3, nella pagina aspx, è scritta così:

<asp:DropDownList ID="DropDownList3" runat="server">
</asp:DropDownList>

2. Ho inserito sempre quel codice già testato e funzionante nell'evento:
Protected Sub DetailsView2_ModeChanged(sender As Object, e As System.EventArgs) Handles DetailsView2.ModeChanged
ed ho seguito le indicazioni riportate nella pagina che mi hai consigliato nella precedente risposta, ma il risultato non cambia, cioè, in questa parte finale, se dichiaro la dropdownlist3, in modalità "edit" del detailview compare la dropdonlist, ma è vuota, se non la dichiaro va in errore la pagina perchè dropdownlist3 non è dichiarato:

'PARTE FINALE DEL CODICE:
' Dim dropdownlist3 As New DropDownList
dropdownlist3.DataSource = dt
dropdownlist3.DataTextField = "snomecomando"
dropdownlist3.DataValueField = "idcomando"
dropdownlist3.DataBind()

'NELLA PAGINA SPX
<asp:DropDownList ID="DropDownList3" runat="server">
</asp:DropDownList>

Lasciando il codice in questo modo la pagina va in errore perchè dropdownlist3 non è dichiarato; se la dichiaro (togliendo il commento davanti a Dim dropdownlist3....) mi compare la dropdownlist3 ma vuota.

A questo punto dove sbaglio? Posso realizzare la dropdownlist3 direttamente da codice, senza scrivere
<asp:DropDownList ID="DropDownList3" runat="server">
</asp:DropDownList>
nella pagina aspx?

Codice funzionante:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra


freeteo Profilo | Guru

Ciao matteoct (omonimo)
a mio avviso il problema sta nel fatto che la dropdown la devi recuperare tramite FindControl(...) nell'evento PreRender del detailsview.
Ti posto un esempio veloce, per farti capire:

protected void dw_PreRender(object sender, EventArgs e) { if (dw.CurrentMode == DetailsViewMode.Edit) { DropDownList combo = dw.FindControl("combo") as DropDownList; combo.DataSource = sqlDataSource.Select(new DataSourceSelectArguments()); combo.DataBind(); combo.Items.Insert(0, new ListItem(...)); } }

il codice è in C#, ma è praticamente uguale a vb.net, invece la parte di Markup è questa:
<asp:DetailsView ID="dw" runat="server" AutoGenerateRows="false" OnPreRender="dw_PreRender" DataSourceID="sqlDataSource" > <Fields> <asp:TemplateField> <ItemTemplate> <%# Eval("ContactName") %> </ItemTemplate> <EditItemTemplate> <asp:DropDownList ID="combo" runat="server" DataTextField="ContactName" DataValueField="CustomerID" /> </EditItemTemplate> </asp:TemplateField> <asp:CommandField ShowEditButton="true" /> </Fields> </asp:DetailsView> <asp:SqlDataSource ID="sqlDataSource" runat="server" ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>" SelectCommand="SELECT [CustomerID], [ContactName] FROM [Customers]"> </asp:SqlDataSource>

Come vedi ho usato una sqlDataSource (che punta ad un db Northwind per far girare l'esempio) ma non è obbligatorio e nel caso di database, preferirei anche io fare tutto a codice per aver maggiore controllo.
Ad ogni modo, io solitamente ho un approccio a "Domain-Model", quindi usare una DataSource nel markup mi capita spesso, chiaramente un ObjectDataSource dove punto ai metodi statici di una classe del mio strato di Business...etc.



x Gluck74:
Sinceramente non sono d'accordo sulla tua espressione "...non credo sia lo scopo di un forum insegnare a programmare, ma rispondere a quesiti" il punto è che ci sono spesso varie risposte alle cose, e il fatto di risolvere direttamente senza "discutere/proporre" delle soluzioni alternative non è il vero spirito di un forum.
A mio avviso, questo non è solo un posto dove un tecnico ti risponde come se avessi aperto un ticket in qualche azienda informatica e chi ti risponde è "pagato" per farlo, è un posto dove chi ti risponde cerca di dare soluzioni più ampie proprio perchè lo fa per passione, ed è proprio l'opinione personale (insieme chiaramente alla risposta tecnica) un valore aggiunto a chi usa questo strumento.
Poi ognuno lo può usare come preferisce, ma io credo che capita questa sottile differenza, lo trova più utile di altre forme di supporto tecnico

Ciao.

Matteo Raumer
[MCAD .net, MVP Visual C#]
http://blogs.dotnethell.it/freeteo

matteoct Profilo | Junior Member

Finalmente ho risolto!!!
era proprio la parte relativa al "Findcontrol" che mi mancava e che cercavo.

Riporto il codice gentilmente consigliato da freeteo, convertito in Vb, integrato da altri spunti di codice consigliati da alx_81 e Gluck74, sperando possa essere di aiuto ad altri:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

P.S. Un altro errore che commettevo era dovuto al fatto che il datasource lo inserivo tra i tag <EditItemTemplate> e </EditItemTemplate>, invece di metterlo dopo </asp:DetailsView>.

Ringrazio tantissimo tutti gli utenti intervenuti.
Ciao
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5