 |
|
 |
|
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 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
|
|
 |
|
 |
|
|