Potser m'avanço a coses que explicaré en la part client, però en una aplicació web, si es vol separar la presentació de les dades hi ha un punt de conflicte que són els combos (desplegables).
Les pàgines que genero només tenen HTML, sense dades, cal doncs un mecanisme per omplir els combos. De moment començaré per explicar la part servidora, un ASHX que es diu comboloader.
Aquest ASHX, s'encarrega de gestionar tots els combos de l'aplicació. Es recolza en la clsDades i derivades on normalment fa servir el mètode GET per anar obtenir els registres, muntar-los en JSON i enviar-los al navegador (al client). La part Javascript del comboloader s'encarrega de desmuntar aquest JSON i posar els valors corresponents als combos. Llavors quan es dissenya una pàgina un combo només és tag <select>, sense valors dins (a vegades es poden posar els valors si són coneguts i no hi ha gaires (ni previsió que hagin més)).
Del navegador es reben un conjunt de combos a carregar (els seus noms venen separats per "-"), els que apareixen en una pàgina i el que es fa es generar-los tots de cop. Per fer això necessitarem objectes que, un cop convertits a JSON donin suport a l'enviament de tots els combos amb els seus valors de cop. Són les classes: Combo i ComboItem.
Són dues classes molt senzilles. Comentar que potser hi ha combos en diferents parts de l'aplicació que tenen els mateixos items però diferents noms, aleshores el que es fa és afegir al "switch" que escull el combo a muntar més opcions. Això fa que moltes vegades ens trobem que el combo que volem muntar en realitat ja està fet per una altra pantalla. Llavors amb una simple línia de codi ja ho tenim enllestit. La construcció dels combos segueix la següent descripció:
Com sempre el codi de cada fase, comencem per "obtenir els combos" i també al final "convertir a JSON i enviar":
/// <summary>/// Genera els items d'un combo/// </summary>/// <param name="TBL">Taula que conte els registres</param>/// <param name="CampID">Camp que va a la part de valor</param>/// <param name="CampDescripcio">Camp que serveix de descripció/// Pot estar format per més d'un camp</param>/// <param name="NumCombo">Número de l'array de combos</param>/// <param name="Separador">Si la descripció t'e més d'un camp, com es separen</param>/// <param name="ValorSiNull">Si hi ha alguna descripció nula</param>publicvoid GeneraItems(DataTable TBL, string CampID,
string CampDescripcio, int NumCombo, string Separador, string ValorSiNull)
{
DataRow DR;
string[] arrCampsDescripio = CampDescripcio.Split('-');
StringBuilder Descripcio = newStringBuilder();
string Camp = "";
if (TBL.Rows.Count > 0)
{
objCombos[NumCombo].Items = new ComboItem[TBL.Rows.Count];
for (int j = 0; j < TBL.Rows.Count; j++)
{
DR = TBL.Rows[j];
Descripcio.Length = 0;
objCombos[NumCombo].Items[j] = new ComboItem();
objCombos[NumCombo].Items[j].Val = DR[CampID].ToString();
for(int i = 0; i < arrCampsDescripio.Length; i++)
{
Camp = arrCampsDescripio[i];
if (i > 0) Descripcio.Append(Separador);
if (!DR.IsNull(Camp)) Descripcio.Append(DR[Camp].ToString().Trim());
else Descripcio.Append(ValorSiNull);
}
objCombos[NumCombo].Items[j].Disp = Descripcio.ToString().Trim();
}
}
}
#21/01/2014 22:54 Programació C# Autor: Alex Canalda