Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
ConvertitoreMisure - Versione Alpha 2.0.01-Problema Eliminazione controlli
Forum - ConvertitoreMisure - Versione Alpha 2.0.01-Problema Eliminazione controlli

Avatar
Mikelius (Member)
Expert


Messaggi: 460
Iscritto: 14/04/2017

Segnala al moderatore
Postato alle 14:48
Martedì, 10/04/2018
Salve, in questa versione alpha ho un problema con l'eliminazione dei controlli sul panelOutput

Nello specifico

Codice sorgente - presumibilmente C#

  1. // Form1.cs rigo.91
  2.         private void SvuotaPanel()
  3.         {
  4.             foreach (Control controllo in panelOutput.Controls)
  5.             {
  6.                 if ((controllo is Label) || (controllo is TextBox))
  7.                 {
  8.                     panelOutput.Controls.Remove(controllo);
  9.                     controllo.Dispose();
  10.                 }
  11.             }
  12.         }



Non mi elimina tutti i controlli (Label e TextBox) dal panel, ma la metà.
Dove sbaglio?


"Io ne ho viste cose che voi umani non potreste immaginarvi...."
PM Quote
Avatar
Thejuster (Member)
Guru^2


Messaggi: 1893
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 16:19
Martedì, 10/04/2018
Facendo

Codice sorgente - presumibilmente ConvertitoreMisure

  1. if ((controllo is Label) || (controllo is TextBox))
  2.                 {
  3.                     panelOutput.Controls.Remove(controllo);
  4.                     controllo.Dispose();
  5.                 }



Questa riga elimina solo controlli di tipo Label o TexteBox
La sintassi non è delle migliori ma può andare

avrei fatto

Codice sorgente - presumibilmente Plain Text

  1. if(controllo.GetType() == typeof(Label) || controllo.GetType() == typeof(TextBox))
  2. {
  3.  
  4.   //ToDo
  5.  
  6. }




Poi dipende da altri fattori.

Ad esempio anche se non lo sai, il controllo LinkLabel viene rilevato come un semplice Label.
e non LinkLabel.

quindi si può fare confusione.

prova così

Codice sorgente - presumibilmente ConvertitoreMisure

  1. IEnumerable<Control> t = panelOutput.Controls.Cast<Control>();
  2.  
  3.  
  4.             Label[] c = t.OfType<Label>().ToArray<Label>();
  5.             TextBox[] tx = t.OfType<TextBox>().ToArray<TextBox>();
  6.  
  7.             panelOutput.Controls.Clear();
  8.  
  9.             List<Control> controlli = new List<Control>();
  10.             controlli.AddRange(c);
  11.             controlli.AddRange(tx);
  12.  
  13.             for (int i = 0; i < controlli.Count; i++)
  14.             {
  15.  
  16.                 panelOutput.Controls.Add(controlli[i]);
  17.             }





Ultima modifica effettuata da Thejuster il 10/04/2018 alle 16:26


PM Quote
Avatar
Mikelius (Member)
Expert


Messaggi: 460
Iscritto: 14/04/2017

Segnala al moderatore
Postato alle 17:00
Martedì, 10/04/2018
Grazie dei consigli (sono all'inizio, qundi sono consapevole che le mie scelte di implementazione non siano delle migliori, miglioreranno)

Comunque sono arrivato a capo dell'errore (credo)

Il metodo remove oltre a rimuovere il controllo, sposta tutti gli altri di un posto facendoli scorrere. In questo modo, eliminando il primo controllo, il secondo prende il suo posto. Il foreach successivamente avanza nella lista e prende il 2° controllo , che era in origine il controllo 3, saltando di fatto il controllo 2(originario), ecco perchè me ne salta la metà.
Dovrei o ritornare indietro con la lista oppure usare il metodo Clear, cancellando tutti i controlli indistintamente.

A parte questo, la gestione della classe tramite l'interfaccia, come ti sembra?

Ultima modifica effettuata da Mikelius il 10/04/2018 alle 17:02


"Io ne ho viste cose che voi umani non potreste immaginarvi...."
PM Quote
Avatar
Thejuster (Member)
Guru^2


Messaggi: 1893
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 18:06
Martedì, 10/04/2018
Il mio metodo fa appunto ciò.

Enumera tutti i controlli del pannello eseguendo un cast di un determinato tipo di oggetto ignorando gli altri.

In questo modo ho tutte le proprietà,nomi,posizioni dei controlli conservati negli array.

In fine elimino tutti i controlli dal panel evitando proprio il tuo errore ed infine li aggiungi tramite una lista o un addrange
L'interfaccia ancora non l'ho vista
Dopo lavoro gli do un occhiata.


PM Quote
Avatar
Carlo (Member)
Expert


Messaggi: 445
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 11:51
Mercoledì, 11/04/2018
Testo quotato

Postato originariamente da Mikelius:

Grazie dei consigli (sono all'inizio, qundi sono consapevole che le mie scelte di implementazione non siano delle migliori, miglioreranno)

Comunque sono arrivato a capo dell'errore (credo)

Il metodo remove oltre a rimuovere il controllo, sposta tutti gli altri di un posto facendoli scorrere. In questo modo, eliminando il primo controllo, il secondo prende il suo posto. Il foreach successivamente avanza nella lista e prende il 2° controllo , che era in origine il controllo 3, saltando di fatto il controllo 2(originario), ecco perchè me ne salta la metà.
Dovrei o ritornare indietro con la lista oppure usare il metodo Clear, cancellando tutti i controlli indistintamente.



Anche io sto studiando i controlli, l'argomento è vasto, capisco il tuo impegno e lo condivido, grazie anche a Thejuster che con gli esempi riportati ci aiuta sicuramente.

Ho visto che usi il TabControl, ti voglio dare una info, semplice quando si sa, ma preziosa se sconosciuta.

Puoi agire solo sui controlli della TabPage che ti interessa:

For Each Controllo In TabControl.TabPages(IndiceDellaPag).Controls

Ultima modifica effettuata da Carlo il 11/04/2018 alle 11:54


In programmazione tutto è permesso
PM Quote