Item Null in combo

martedì 05 gennaio 2010 - 00.16

cldparisi Profilo | Newbie

In una tabella ho una foreignkey nullabile, il mio oggetto orm che punta a quella tabella ha una proprietà di tipo int?.
Metto in binding questa proprietà con il SelectedValue di una combo, la combo la popolo oltre che con i valori presi dalla tabella a cui punta la FK anche con un elemento vuoto in modo che se vien selezionato quello mi scriva null nel mio record ma se la combo è così popolata sia che seleziono quell'elemento sia che se seleziono un altro mi viene dato un errore perché sembra che l'ObjectDataSource provi a trasformare il valore in int invece che in int?, sono certo che il tipo è int? infatti mettendo nell'elemento vuoto della combo come value -1 se poi vado nell'evento Updating dell'ObjectDataSource riesco a sostituire il valore con null.
Sbaglio qualcosa e si deve fare qualcosa di particolare per dare ad un item della combo come valore null?


--
Claudio P.

FrancescoGuadagno Profilo | Senior Member

Questa cosa è molto interessante ma credo proprio che le soluzioni possibili sono analoghe a quelle che hai trovato.
Il "problema" è che il selectedValue è una proprietà string della dropdownlist che è "mappata" sulla proprietà "Value" di ogni singolo ListItem contenuto, ancora una volta di tipo string.
Quando tu assegni un valore al selectedValue, puoi farlo in due modi

ddl.SelectedValue = "null"; ddl.SelectedValue = null;

Nel primo caso prenderesti solo l'eventuale elemento con stringa "null".
Nel secondo caso non prenderai mai niente, e lo puoi vedere con reflection. Nella Set del SelectedValue di un ListItem (quindi anche di una DropDownList) il codice eseguito è:

... if ((value == null) || (base.DesignMode && (value.Length == 0))) { this.ClearSelection(); return; } ...
Quindi se value è null, ottieni solo che la ddl non abbia elementi selezionati.

cldparisi Profilo | Newbie

Ok, grazie per la risposta e per il chiarimento del funzionamento.

Peccato perchè sto cercando di fare quasi tutto in modo dichiarativo e con poco o nessun codice scritto nel file .cs e poi lasciar fare il proprio lavoro alle classi orm che mi sono creato. Vorra dire che in quesot caso, che in verità non è per niente l'unico, scrivero alcune righe di codice nel codebehind prima di "passare la palla" agli oggetti orm in modo che questi si trovino un valore corretto nelle varie proprietà.
Grazie
--
Claudio P.
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