Non riesco ad abilitare l'item nel menustrip

giovedì 18 giugno 2009 - 09.53

sanfra Profilo | Junior Member

Salve, cercherò di essere il più chiaro possibile, per spiegare questa stranezza(almeno per me).

Allora ho creato una form(Pannello Principale)MDI,dove ho inserito un menustrip e (per il momento) ho messo due "pulsanti" (Anagrafica - Chiudi).

Quando questo pannello viene avviato si apre insieme a lui un'altra form(Login) dove appunto serve per loggarsi,e nell'vento onload del Pannello faccio un ciclo per disabilitare il "pulsante" Anagrafica, e di conseguenza aprire la form Login e fin qui tutto bene.

Successivamente, sull'evento click del pulsante accedi della form Login, mi faccio segnalare, da un evento che ho creato, se le credenziali sono corrette mi faccio tornare un vazlore boolean(L'evento creato da me l'ho chiamato OnLoggato) e all'interno di questo evento rifaccio il ciclo degli items del menustrip e riabilito il "pulsante" che è stato disabilitato inizialmente.

Il problema sorge proprio qui,non me lo abilita, nononstante facendo il dovuto debug e vedendo che passa e gli assegna ad Enabled il valore true, rimane disabilitato.

Mi stavo chiedendo il problema per caso è l'evento Load del form Pannello(forse ripassa da lì, successivamente) e se è si, potete darmi un suggerimento per risolvere la questione.


Grazie e spero soprattutto di essere stato chiaro.

Jeremy Profilo | Guru

Ciao Francesco.
Puoi mostrare il codice che usi per disabilitare gli item e successivamente per riabilitarli???

Ciao

sanfra Profilo | Junior Member

si certamente,

questo è il codice per disabilitare gi items nell'evento load del pannello(MDIPadre)

private void Pannello_Load(object sender, EventArgs e) { for (int i = 0; i < menuStrip1.Items.Count - 1; i++) { if (menuStrip1.Items[i].Text == "Anagrafica Cliente") { menuStrip1.Items[i].Enabled = false; } } Login login = (Login)this.ActiveMdiChild; if (login == null) { frmlog = new Login(); frmlog.MdiParent = this; frmlog.Show(); } }

mentre questp è il codice per abiliatre gli items nell'evento da me creato e sempre all'interno del form Pannello:
public void Loggato(object source, LoggaturaEventArgs e) { if (e.Login == true) { for (int i = 0; i < menuStrip1.Items.Count; i++) { if (menuStrip1.Items[i].Text == "Anagrafica Cliente") { menuStrip1.Items[i].Enabled = true; } } } }

Jeremy Profilo | Guru

Ciao.
Se non ricevi nessuna eccezione, è perchè il codice dell'evento Loggato non viene proprio eseguito, in quanto questa riga:
> for (int i = 0; i < menuStrip1.Items.Count; i++)
dovrebbe generare un eccezione IndexOutOfRange e dovrebbe diventare:
> for (int i = 0; i < menuStrip1.Items.Count - 1; i++)

Sei sicuro che e.Login sia True???

Facci sapere...
Ciao

sanfra Profilo | Junior Member

Ciao grazie ancora per il tuo intervento.ti rispondo, che la propietà di e.Login è true perchè ho fatto il debug, e inoltre entra nell'evento loggato e mi conta esattamente i "pulsanti" nel menustrip1.

Siccome mi sembra alquanto strano tutto questo e visto che anche a te non ti è chiaro il perchè, volevo postarti anche il resto del codice in modo che sia per tutti più semplice capirlo e caso mai trovare la soluzione:

La classe LoggaturaEventArgs è la seguente:

public class LoggaturaEventArgs : EventArgs { private bool _login; public bool Login { get { return _login; } set { _login = value; } } public LoggaturaEventArgs() { } public LoggaturaEventArgs(bool l) { this.Login = l; } } public delegate void LoggaturaEventHandler(object source,LoggaturaEventArgs e);

Dopodichè nella form Login dichiaro il resto:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

cmq ho messo nuovamente un breakpoint sull'evento Loggato sul form Pannello ed ho constatao(dopo aver corretto il count-1)che entra e valuta correttamente il tutto.

Avete altre idee da potermi suggerire per questo problema?

Grazie di tutto

P.S.:Non voglio assolutamente mettere fretta a nessuno, è solo che da quasi 24 ore che ci sbatto la testa e non capisco come risolvere.

Jeremy Profilo | Guru

Ciao Francesco.
Non mi viene in mente nulla ..... prova per un attimo ad eliminare questa condizione:
> if (menuStrip1.Items[i].Text == "Anagrafica Cliente")
e vedere se in questo modo viene abilitato.

Facci sapere...
Ciao

sanfra Profilo | Junior Member

Grazie Jeremy per il tuo prezioso aiuto,ma nulla da fare neppure con questo intervento, siccome non ho il tempo di capire il perchè di questo errore, volevo chiederti, se per caso, invece di usare gli eventi(sempre se è il loro il problema) utilizzo una proprietà di tipo boolean e gliela passo al costruttore del form(Progetto) e da lì provo ad eseguire la condizione.
Che ne pensi?


GRazie ancora

Jeremy Profilo | Guru

Prova a fare ancora questa prova .... esegui la procedura nella gestione dell'evento click di un button....oppure, più semplicemente, abilita e disabilita il menustrip.

Facci sapere...
Ciao

sanfra Profilo | Junior Member

ciao la prova che ho continuato a fare è stata quella di provare a farmi dare un messaggio con messagge.show() e mi appare, ma poi ho provatio anche a vedere se per caso il Form Pannello era attivo(bool f= this.Focused()) e ho constatato che non lo era.

A questo punto penso sia un problema di focus o qualcosa del genere che io non riesco a gestire.

aiedail92 Profilo | Expert

Ciao sanfra, ciao Jeremy

Non sono d'accordo con quanto detto da Jeremy:

>questa riga:
>> for (int i = 0; i < menuStrip1.Items.Count; i++)
>dovrebbe generare un eccezione IndexOutOfRange e dovrebbe diventare:
>> for (int i = 0; i < menuStrip1.Items.Count - 1; i++)

Dato che la condizione è "strettamente minore", e non "minore o uguale", l'eccezione non si verifica, e anzi mettendo Count - 1, si tralascia l'ultimo elemento.

A parte questa svista (che devi correggere anche in Pannello_Load), metti un BreakPoint sulle righe

menuStrip1.Items[i].Enabled = false;
menuStrip1.Items[i].Enabled = true;

Rispettivamente in Pannello_Load e Loggato, e dicci se si ferma solo su una (e quale), su nessuna o su entrambe.

Luca

Jeremy Profilo | Guru

Ciao Luca.
Hai ragione ... non ci avevo fatto caso.
Ciao

sanfra Profilo | Junior Member

ciao aiedail92, grazie anche per il tuo intervento, avevo già provato a mettere il breakpoint in tutte e due gli eventi Page_Load e Loggato, e in tutte e due i casi il breakpoint entra e passa all'interno del menustrip1.items[i].Enabled.


P.S.: avevo scritto nel mio precedente post che non è attivato il focus sul Form Pannello e se per caso aveva senso.


Grazie ancora per il Vostro preziosissimo aiuto.


Jeremy Profilo | Guru

Ciao.
>P.S.: avevo scritto nel mio precedente post che non è attivato
>il focus sul Form Pannello e se per caso aveva senso.
Non ha il focus ma è comunque caricato il Form?.
Hai provato, come ti avevo suggerito, ad eseguire la procedura di abilitazione del menustripitem nella gestione dell'evento click di un button ..... in modo da escludere una serie di possibili cause al problema???(non centra nulla il fatto che ti visualizzi il messagebox .... che la procedura viene eseguita lo abbiamo già verificato)
Ed hai provato anche ad abilitare e disabilitare tutto il menustrip(non il singolo item)???

Facci sapere...
Ciao.

sanfra Profilo | Junior Member

si il form viene caricato. non ho ben capito, come devo fare per abilitare il menustrip da un button.

ho già fatto la prova di abilitare e disabilitare il menurtip interamente ed è sempre la stessa cosa, sull'evento onload me lo disabilita ma nell'evento loggato non me lo riabilita.

Jeremy Profilo | Guru

Ciao.
>non ho ben capito, come devo fare per abilitare il menustrip da un button
Il codice che hai scritto nell'evento Loggato .... lo sposti nell'evento Click di un nuovo button che crei solo per fare la prova.
All'apertura del form, il menustrip viene disabilitato .... prova a vedere se premendo quel button viene riabilitato.

Facci sapere...
Ciao

sanfra Profilo | Junior Member

Ciao,ma il button deve essere posizionato sempre sulla barra del menu strip, accanto all'altro pulsante caso mai?

Grazie e scusami se non ho capito ancora una volta bene, sto andando in confusione con questo problema.

Jeremy Profilo | Guru

>ma il button deve essere posizionato sempre sulla barra del menu strip, accanto all'altro pulsante caso mai?
No....un button normale.....nell'evento click scrive la procedura che adesso è scritta in Loggato.
L'obbiettivo è escludere alcune possibile cause del problema.
Ciao

sanfra Profilo | Junior Member

Nel caso sia come ho decsritto nell'ultimo mio post, ho fatto la prova inserendo il codice all'interno dell'items(che ho chiamato Chiudi) che era accanto all nostro famoso altro items(Anagrafica Cliente) e mi abilita il tutto.

sanfra Profilo | Junior Member

cmq si con il pulsante funziona mi abilita il tutto, quindi il problema è l'evento dame creato corretto?

Jeremy Profilo | Guru

Mannaggia a te .....ed a me ...... il problema è qui:
p = new Pannello();

Nel form Login, crei un nuovo gestore evento:
this.Loggato += new LoggaturaEventHandler(p.Loggato);
facendo riferimento ad una nuova istanza del form Pannello .... che quindi, avrà degli oggetti diversi da quelli del form Pannello con istanza predefinita.

Prova a risolverlo semplicemente modificando questa riga:
this.Loggato += new LoggaturaEventHandler(p.Loggato);
con:
this.Loggato += new LoggaturaEventHandler(Pannello.Loggato);

Facci sapere...
Ciao

sanfra Profilo | Junior Member

ciao jeremy, anche io avrei risolto,ma in maniera un pò diversa, prima però perchè mi dici
mannaggia a me
, io solo fatto riferimento a Voi(inteso come forum) che siete più esperti di me.

Comunque io inserito questo codice
frmlogin.Loggato += new LoggaturaEventHandler(this.Loggato);
nell'evento onload del form pannello.

però ho capito, grazie a te il perchè e cioè che il riferimento al form pannello creava una nuova istanza, senza, naturalmente prendere nenache gli eventi associati.


P.S.:ti volevo chiedere come se hai un link di riferimento dove parla in maniera analitica delle finestre MDI.


Grazie

Jeremy Profilo | Guru

Ciao Luca.
>ciao jeremy, anche io avrei risolto,ma in maniera un pò diversa,
>prima però perchè mi dici mannaggia a me,
Hai palesemente frainteso ..... ma non è colpa tua .... purtroppo è difficile esprimere il tono di ironia in un post.....avrei dovuto mettere una faccina.
La mia *imprecazione* è dovuta al fatto che mi ero un pò affezionato al problema e ci tenevo a risolverlo .... ma, in nessun modo era riferita a te, ma, piuttosto, al tempo che ci abbiamo messo per risolverlo.

>io solo fatto riferimento a Voi(inteso come forum) che siete più esperti di me.

e quelli più esperti di te, ne sono contenti, altrimenti non seguirebbero il forum come fanno.

Comunque, ripeto, l'imprecazione non era assolutamente rivolta a te .... non ne avrei il diritto e comunque mi fa piacere aiutare, per quel che so, chi ha problemi di programmazione.....altrimenti non sarei neanche iscritto al forum.


Ad ogni modo ... sono contento che hai risolto.
Alla prossima....
Ciao

sanfra Profilo | Junior Member

SI, assolutamente, anche io sono così contento e soprattutto fiero di aver scelto come mio punto di riferimento il forum di dotnethell, il quale è quello più professionale tra tutti.inoltre sono così contento che nel post mio, precedente, ho anche io fatto una battuta, lo so che non era rivolto intenzionalmente.

Grazie ancora di tutto!



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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5