Omgili, forum search, forums search, search forums, discussion search,discussions search, search discussions, board search, boards search, search boards
  Advanced Search

Re: Ordinamento DropDownList

On Mon, 09 Mar 2009 09:07:51 +0100, Andrea Dottor [MVP] <...@NOSPAMdottor.net

Luigi wrote :

Utilizzando una ObjectDataSource vuol dire che chiami un metodo che sta
in una classe.
In questa classe avrai il codice che si occupa di fare il recupero dati
e presumo ti ritorni un dictionary (chiave + valore). Non devi far
altro che travasare questi dati in un OrderedDictionary usando come
chiave i valori che devi ordinare (ma occhio che siano univoci). La
logica di ordinamento è già interna a questo tipo di dictionary, e
quando li avrai bindati vedrai che saranno tutti ordinati.

il codice dovrebbe essere più o meno così:
public OrderedDictionary GetDropDownListValue(....)
{
Dictionary<int, stringDataSourceProvider.MioMetodo(...);

OrderedDictionary myOrderedDictionary = new OrderedDictionary();
foreach (KeyValuePair<int, string {
myOrderedDictionary.Add(kvp.Value, kvp.key);
}

return myOrderedDictionary;
}

ciao

--
Andrea Dottor
Microsoft MVP - ASP/ASP.NET
Member of: http://www.xedotnet.org
Blog: http://blog.dottor.net



On Mon, 9 Mar 2009 04:09:02 -0700, Luigi <...@inwind.it

Ciao Andrea,
il problema è che il mio ObjectDataSource, del tipo:

<asp:ObjectDataSource ID="ObjectDataSourceComparto" runat="server"
SelectMethod="Read" TypeName="Fire.BusinessComponent.CompartoComponent" .....
....

ha un metodo nel DataAdapter che mi ritorna una DataTable:

public DatasetMasterFire.CompartoDataTable Read(string whereCondition,
string orderCriteria, bool history, DateTime historyDate)
{
string viewName = "[Fire].[vwComparto]";
string baseTableName = "Fire.Comparto";
string primaryKeyFieldName = "CompartoId";
orderCriteria = "CompartoDescription";

using (SqlDataAdapter da =
SqlHelper.PreparareDataAdapterForReadWithReverseBackHistoryManagement(
"*", viewName, ParseWhereCondition(whereCondition),
orderCriteria, history, historyDate, baseTableName, primaryKeyFieldName))
{
DatasetMasterFire.CompartoDataTable table = new
DatasetMasterFire.CompartoDataTable();
da.Fill(table);

return table;
}
}

Le varie combo della pagina utilizzano quindi i campi restituiti dalla vista.
E se sono ordinati per uno, per gli altri no.

L

On Mon, 09 Mar 2009 12:27:33 +0100, Andrea Dottor [MVP] <...@NOSPAMdottor.net

Luigi wrote :

Ok, hai scelto la via più semplice e veloce. ;-)

Quello che avresti dovuto fare è di creare un metodo per ogni
DropDownList che devi popolare e che ti restituisca un dictionary o una
lista di oggetti che poi andrai a bindare.
Se ci pensi, alle DropDownList occorre solo una lista di coppie
chiave+valore

Con il tuo codice, per ogni DropDownList, verrà richiamato quel metodo
che ti ritorna tutti i campi della vista, e quindi un passaggio di dati
maggiore di quanto sia effettivamente utile.

Per risolvere velocemente potresti passare un ulteriore parametro che
definisce la colonna di ordinamento, oppure (cosa che ti consiglio),
creare un metodo per ogni lista che devi bindare, che restituisca i
soli elementi che ti servono e opportunamente ordinati.

Ti vorrei dare un ulteriore consiglio. Cerca di ritornare degli oggetti
e non delle datatable. Questo ti richiederà un pò di lavoro in più
all'inizio del progetto, ma ne beneficerai notevolmente.
prova a pensare a un tuo collega che utilizzerà il tuo metodo Read,
come può sapere quali dati vengono ritornati? (è solo un esempio)
http://it.wikipedia.org/wiki/Programmazione_orientata_agli_oggetti

ciao

--
Andrea Dottor
Microsoft MVP - ASP/ASP.NET
Member of: http://www.xedotnet.org
Blog: http://blog.dottor.net


On Mon, 9 Mar 2009 04:52:01 -0700, Luigi <...@inwind.it

Grazie per le precisazioni Andrea.
Purtroppo, come spesso accade, mi sto occupando di manutenere (ed evolvere,
fino dove è possibile) un'applicazione scritta da altri (e che ormai non ci
sono più).
Vorrei evitare però di riscrivere tutta l'applicazione, e devo trovarmi il
modo per ottenere questo risultato il più rapidamente possibile, anche a
scapito di non seguire validi pattern di programmazione.

Luigi

On Mon, 09 Mar 2009 13:04:40 +0100, Andrea Dottor [MVP] <...@NOSPAMdottor.net

Luigi wrote :

Visto che userai una ObjectDataSource per ogni DropDownList, aggiungi
un parametro fisso (tra i selectparameters) dove setti il nome della
colonna di ordinamento e lo utilizzi per ordinare i dati che recuperi
dalla vista.

ciao

--
Andrea Dottor
Microsoft MVP - ASP/ASP.NET
Member of: http://www.xedotnet.org
Blog: http://blog.dottor.net


On Mon, 9 Mar 2009 07:22:01 -0700, Luigi <...@inwind.it

Ok, esattamente, però come faccio a capire che quella certa DropDownList
deve utilizzare un certo parametro di ordinamento?
Esiste una proprietà della DDL che mi permette questo?

Luigi

On Mon, 09 Mar 2009 15:26:24 +0100, Andrea Dottor [MVP] <...@NOSPAMdottor.net

Luigi wrote :

No, devi cablarlo tu a mano.
Anche perchè sei tu a definire quali proprietà (colonne) bindare alla
dropdownlist

ciao

--
Andrea Dottor
Microsoft MVP - ASP/ASP.NET
Member of: http://www.xedotnet.org
Blog: http://blog.dottor.net


On Mon, 9 Mar 2009 08:27:03 -0700, Luigi <...@inwind.it

Ok, nel mio ObjectDataSource metto:

<SelectParameters <asp:Parameter DefaultValue="" Name="orderCondition"
Type="String" /</SelectParameters

però come lo cablo nelle proprietà della DropDownList?

Luigi

On Mon, 09 Mar 2009 16:54:23 +0100, Andrea Dottor [MVP] <...@NOSPAMdottor.net

Luigi wrote :

Forse mi sono spiegato male.
Tu avrai un ObjectDataSource per ogni DropDownList. E quindi in ogni
ObjectDataSource dovrai aggiungere quel SelectParameters con
specificato come DefaultValue il nome della colonna di ordinamento.
Ogni DropDownList avrà questo parametro settato a seconda della colonna
che usa.

ciao

--
Andrea Dottor
Microsoft MVP - ASP/ASP.NET
Member of: http://www.xedotnet.org
Blog: http://blog.dottor.net


On Tue, 10 Mar 2009 03:25:01 -0700, Luigi <...@inwind.it

Azz ecco, quello che temevo, alla fine serve un ObjectDataSource per ogni
combobox.
Però, una semplice proprietà da impostare, o un metodo che agisce prima del
rendering della combo, in cui poter ordinare i valori, non sarebbe stata una
cattiva invenzione da parte del team di ASP.NET ;-)

Luigi

On Tue, 10 Mar 2009 11:32:18 +0100, Andrea Dottor [MVP] <...@NOSPAMdottor.net

Luigi wrote :

Nessuno ti vieta di non farlo tu.
Nell'evento OnPreRender puoi per ogni dropdownlist leggere gli elementi
che ha nella collection Items, ordinarli e poi reinserirli. ;-)
Non ho mai provato, ma teoricamente è possibilissimo.

ciao

--
Andrea Dottor
Microsoft MVP - ASP/ASP.NET
Member of: http://www.xedotnet.org
Blog: http://blog.dottor.net


On Tue, 10 Mar 2009 04:23:02 -0700, Luigi <...@inwind.it

Stavo tentando un metodo del genere:

protected void cmbCodiceISIN_OnPreRender(object sender, EventArgs e)
{
DropDownList dd = (DropDownList)sender;
ListItemCollection values = dd.Items;

OrderedDictionary valori = new OrderedDictionary();
foreach(string s in dd.Items)
{
valori.Add(s,s);
}

}

ma non mi riesce di completarlo e "ribindarlo" poi alla dropdownlist.

L

On Tue, 10 Mar 2009 12:29:38 +0100, Andrea Dottor [MVP] <...@NOSPAMdottor.net

Luigi wrote :

Non l'ho provato ma dovrebbe essere così:

dopo il tuo codice aggiungi questo

dd.Items.Clear();
foreach (KeyValuePair<object,object {
dd.Items.Add(new ListItem(item.Value as string, item.Value as
string))
}

ciao

--
Andrea Dottor
Microsoft MVP - ASP/ASP.NET
Member of: http://www.xedotnet.org
Blog: http://blog.dottor.net


On Tue, 10 Mar 2009 04:43:02 -0700, Luigi <...@inwind.it

Adesso è così:

protected void cmbCodiceISIN_OnPreRender(object sender, EventArgs e)
{
DropDownList dd = (DropDownList)sender;
OrderedDictionary valori = new OrderedDictionary();

for(int i=0; i<dd.Items.Count; i++)
{
valori.Add(i, dd.Items[i].ToString());
}

dd.Items.Clear();
foreach (KeyValuePair<object, object {
dd.Items.Add(new ListItem(item.Value as string, item.Value as
string));
}
}

ma mi da' errore sulla riga "KeyValuePair<object, object
Specified cast is not valid.

L


On Tue, 10 Mar 2009 12:49:05 +0100, Andrea Dottor [MVP] <...@NOSPAMdottor.net

Luigi wrote :

Scusa...avevo scritto il codice al volo e non mi sono ricordato che
l'ordereddictionary ha una collection di DictionaryEntry e non di
KeyValuePair.

quindi sostituisci il foreach usando il DictionaryEntry
foreach (DictionaryEntry item in valori
{...}

http://msdn.microsoft.com/it-it/library/system.collections.specialized.orderedd ictionary(VS.80).aspx
ciao

--
Andrea Dottor
Microsoft MVP - ASP/ASP.NET
Member of: http://www.xedotnet.org
Blog: http://blog.dottor.net


On Tue, 10 Mar 2009 06:21:01 -0700, Luigi <...@inwind.it

Ora il metodo è così:

protected void cmbCodiceISIN_OnPreRender(object sender, EventArgs e)
{
DropDownList dd = (DropDownList)sender;
OrderedDictionary valori = new OrderedDictionary();

for(int i=0; i<dd.Items.Count; i++)
{
valori.Add(i, dd.Items[i].ToString());
}

dd.Items.Clear();

foreach (DictionaryEntry item in valori)
{
dd.Items.Add(new ListItem(item.Value as string, item.Value
as string));
}
}

compila, ma non fa quello che deve fare, ovvero la combo rimane coi valori
messi un po' a caso.
Strano, non capisco come mai non lo prenda.

L

On Tue, 10 Mar 2009 14:34:19 +0100, Andrea Dottor [MVP] <...@NOSPAMdottor.net

Luigi wrote :

Controlla in debug che il prerender non avvenga prima del DataBind,
altrimenti non ordineresti nulla.
Altra prova che puoi fare è spostare il codice nell'evento OnPreRender
della pagina e non della DropDownList.

ciao

--
Andrea Dottor
Microsoft MVP - ASP/ASP.NET
Member of: http://www.xedotnet.org
Blog: http://blog.dottor.net


On Tue, 10 Mar 2009 07:20:42 -0700, Luigi <...@inwind.it

Andando in debug ho notato che è in realtà il metodo che non ordina i valori.
Li preleva dai dati della combo, la svuota, ma poi la riempie nello stesso
ordine.
Non capisco come mai l'OrderedDictionary non ordina.

L

On Tue, 10 Mar 2009 16:10:00 +0100, Andrea Dottor [MVP] <...@NOSPAMdottor.net

Luigi wrote :

Sostituisci l'ordereddictionary con la SortedList
http://msdn.microsoft.com/en-us/library/system.collections.sortedlist.aspx

ciao

--
Andrea Dottor
Microsoft MVP - ASP/ASP.NET
Member of: http://www.xedotnet.org
Blog: http://blog.dottor.net


Discussion Title: Re: Ordinamento DropDownList
Title Keywords: Ordinamento  DropDownList