CascadingDropDownlist in WizardControl

mercoledì 13 aprile 2011 - 11.28
Tag Elenco Tags  C#  |  .NET 3.5  |  Windows XP  |  Javascript

jackie1977 Profilo | Newbie

Un saluto a tutti,

Ho cercato qualche soluzione su web, ma nulla di fatto
Ho tre cascadinDropDownList (Classico popolamento a catena Regioni, Province, Citta) all'interno di un controllo Wizard che a sua volta si trova in un Update Panel.

I tre cascadinDropDownList si trovano esattamente al terzo di sei step del controllo Wizard.

La mia esigenza è la seguente: Quando scateno l'evento "previousButtonClick" desidero che tutti i campi dello step del Wizard corrente si "resettino". Chiaramente all'interno dello step incriminato ci sono le cascadinDropDownList.

Ora. Non posso (o forse non sono in grado..più probile) "resettare" le tre ccascadinDropDownList per mezzo di Javascript con il seguente metodo (ne riporto solo uno, ma valido per tutte e tre)

$get(" + ddlEditCitta.ClientID + ").selectedIndex = 0;
$find(" + CascadingDropDownEditCitta.ClientID + ")._onParentChange(false);
$find(" + CascadingDropDownEditCitta.ClientID + ").set_SelectedValue('', '');

perchè pur avendo il framework assegnato correttamente un ClientID valido, Javascript genera un errore perchè scorrendo il DOM della pagina, giustamente, l'elemento non esiste (difatti la pagina mi viene sempre renderizzata a partire dallo step 1 del wizard e trovandomi in un contesto asincrono gli step successivi sono correttamente aggiornati code-behind, ma non renderizzati nel browser)

Scartata l'ipotesi Javascript ho provato ad eseguire più semplicemente le istruzioni (il mio emptyValue è -1, ma ho provato anche con "")

CascadingDropDownEditRegioni.SelectedValue = "-1";
CascadingDropDownEditProvincie.SelectedValue = "-1";
CascadingDropDownEditCitta.SelectedValue = "-1";

Ma ahimè le tre cascadinDropDownList non "ritornano" ai valori iniziali.

Stavo pensando di rieseguire i webService per ripopolare il tutto, ma non sono in grado di farlo e non ho trovato nulla a riguardo su Web

Qualche suggerimento, consiglio o critica se necessario..

Un grazie in anticipo

Gianluca

Gluck74 Profilo | Guru

Faccio solo una piccola premessa, giosto per vedere se siamo allineati:
I controlli ajax hanno una "copia client" (permettetemi il termine) che rispecchia in pratica il controllo server per quanto riguarda metodi, proprietà ed eventi.
Per potersi agganciare a questo "oggetto client", è necessario utilizzare la proprietà "BejaviorID".
Da codice javascript, c'è quindi differenza nel cercare il controllo con $get ed il ClientID o con $find e il BehaviorID.
Solitamente io metto il BehaviorID del controllo uguale a ID.
In questo modo quando devo comporre una funzione javascript da codice, passo l'ID e non il clientID, ma è da considerarsi il BehaviorID
Bosogna usare il secondo modo.


Dunque, facciamo questa prova:

innanzi tutto devi per forza mettere
BehaviorID="ddlEditCitta"
Dopo di che nel codice javascript:
var objddl = $find("ddlEditCitta") if (objdll) { objdll.set_SelectedIndex = 0; }

fammi sapere

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

jackie1977 Profilo | Newbie

Grazie mille Gluck per il tuo aiuto,

In modo decisamente spartano ho comunque risolto (sebbene il metodo non piaccia molto nemmeno a me).

Ho provato a seguire il tuo suggerimento, ma non ha funzionato; provo a spiegarmi:

- Ho assegnato la proprieta BehaviorID ai i tre cascadind.
- Via Javascript eseguo tutti i miei controlli lavorando sui metodi "InizializeRequest BeginRequest e EndRequest".

- Nel BeginRequest $find( [ id_dropDown] ) funziona, nel senso che trova l'oggetto, esegue il selected_index = 0, ma poi la dropDown non si "resetta" (pur provando ad eseguire i metodi set_SelectedValue('', ''); e _onParentChange(true); per tutte le cascading)

- Nel EndRequest (ove pensavo fosse più logico eseguire il reset delle dropDownList (o cascading ci siamo intesi) i metodo trova l'oggetto nullo e mi viene restituito un errore

Ti segnalo la mia, poco elegante, soluzione: tengo traccia dello stato dell'abilitazione dei pulsanti della sideBarButton e nel BeginRequest dell'evento NetxButtonClick eseguo quanto segue:


$find(CascadingDropDownEditRegioni).set_SelectedValue('', '');
$find(CascadingDropDownEditRegioni)._onParentChange(true);

dove CascadingDropDownEditRegioni è il ClientID della cascading.


E'chiaro che sarebbe per me più comodo poter gestire tale situazione nella gestione dell'evento PreviousButtonClick e non nell'evento NextButtonClick tenendo memorizzato lo stato del pulsante che determina la sua abilitazione o meno.

Ma ancora non scoperto come fare..

Grazie mille per il momento!

Gianluca





Gluck74 Profilo | Guru

Premesso che non ricordo cosa faccia _onParentChange(true), io non ho gestito il reset nel BeginRequest, bensì in una funzione javascript richiamata al momento opportuno.
Ovvero, io ho i cascadingDDL in un modalPopUp che visualizzo da javascript ( .show() ). Proprio in questa funzioine, prima di visualizzare, inizializzo semplicemente con set_SelectedIndex = 0 (occhio al set_), che dovrebbe essere equivalente a set_SelectedValue('', '') (o uno o l'altro)

Probabilmente la tua inizializzazione fatta nel BeginRequest, viene annullata da eventi successivi richamati dalla pagina per ripristinare lo stato precedente.
Prova a spostare l'inizializzazione in un altro posto successivo al BeginRequest.

Comunque, come dice sempre un mio collega, eleganza e tempistiche sono inversamente proporzionali alle esigenze del cliente (leggi capo che stressa) ;-))


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

jackie1977 Profilo | Newbie


L'idea di utilizzare una funzione Javascript non dispiaceva nemmeno a me, ma avrei dovuto assegnarla lato server al pulsante PreviousButton del controllo Wizard (quindi leggermente più noiso da gestire), ma dato che devo gestire anche altre operazioni asincrone ho deciso di utilizzare i metodi "BeginRequest e EndRequest" di AJAX ASP.NET

Farò comunque una prova dato che la cosa mi incuriosisce..

Ahimè, sono comunque certo che non ci sono eventi successivi che annullano lo stato delle CascadingDropDpwn. L'unica cosa che mi viene da pensare è che sia il controllo Wizard, ma non ne sono assolutamente certo.

il metodo _onParentChange(true) semplicemente abilita il cambiamento di stato della Cascadin stessa

//determino il valore da selezionare
$find(CascadingDropDownEditRegioni).set_SelectedValue('', '');

//abilitito il cambiamento del cascadingDropDown che di conseguenza, "forza" l'aggiornamento in cascata delle successive cascadingDropDown
$find(CascadingDropDownEditRegioni)._onParentChange(true);

Grazie ancora per i suggerimenti

P.S. Riferisci al tuo collega: "Parole Sante!"

Gianluca
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