Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 29
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    121

    Windows Form e suoi oggetti (C#)

    Gentili amici,

    ho un piccolissimo (!) problema.

    Io sono un vero niubbo sul C#, ma sono un decente programmatore JAVA. In parole semplici, vorrei capire come operare sugli oggetti del window form.
    Esempio:

    Ho un Form che contiene una textbox (textBox1) e un pulsante (bottone1). Alla pressione di bottone1 viene istanziata la classe "controllaTextBox(string contenutoTextBox)" che, in pratica, verifica che il contenuto della textBox sia diverso da un certo valore. Se il valore inserito è diverso da quello che non voglio, il form si deve "pulire", e cioè si devono eliminare i suoi oggetti (ovvero textBox1 e bottone1). Se utilizzo riferimenti statici, il metodo "Dispose()" funziona, se utilizzo invece la sola istanza del form, questo non va. Ecco il codice:

    codice:
    public System.Windows.Forms.Panel panel1;
    		public static System.Windows.Forms.Button bottone1;
    		public System.Windows.Forms.TextBox textBox1;
    		
    		void bottone1Click(object sender, System.EventArgs e)
    		{
    			string contTextBox = textBox1.Text;
    			if (contTextBox.Equals("")) {
    				System.Windows.Forms.MessageBox.Show("Inserire un valore!", "Errore");
    			} else {
    				new controllaTextBox(contTextBox);
    	
    			
    				
    			}
    			
    			}
    		}
    e questo è il codice di controllaTextBox:

    codice:
    public controllaTextBox(string contTextBox)
    		{
    			MainForm.bottone1.Dispose();
    			MainForm mf = new MainForm();
    			mf.textBox1.Controls.Dispose();
    		}
    e, come ho già detto, dal form viene "disposato" soltanto il bottone, ma non la textBox. Ora, in JAVA saprei perfettamente come fare, ossia passerei come parametro il form stesso, pulirei ciò che non mi interessa e il gioco sarebbe fatto, ma qui invece funziona solo se invoco il metodo su un valore statico, ed è una cosa che voglio assolutamente evitare, per questioni di thread-safety. Ovvero, vorrei seguire il detto "static is what static should really be". :-)
    Mi piacerebbe capire, ad ogni modo, come lavorare "graficamente", nel senso che non ho capito se devo creare nuovi form o se devo utilizzare lo stesso, aggiungendo e togliendogli componenti desiderati. Se devo utilizzare lo stesso form, come faccio a progettarne l'interfaccia usando l'IDE (uso SharpDevelop 3.1)?

    Grazie mille a chi mi saprà aiutare!

  2. #2
    Ciao.
    O non ho capito il problema .... o l'errore è talmente evidente che sembra quasi assurdo che non te ne sia accorto

    Se guardi bene .... ti accorgi che per il dispose del button fai riferimento all'istanza predefinita del form (quella su cui quindi stai lavorando) ed il button sparisce dal form....successivamente crei una nuova istanza del form al quale fai riferimento per puntare la textbox ..... che non sarà mai la stessa del form che hai aperto.
    Dovresti, semplicemente, usare lo stesso coidce che usi per il button anche per la textbox.
    Quindi:

    codice:
    MainForm.bottone1.Dispose();
    MainForm.textBox1.Dispose();
    Facci sapere....
    Ciao

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    121
    Originariamente inviato da Jeremy75
    Ciao.
    O non ho capito il problema .... o l'errore è talmente evidente che sembra quasi assurdo che non te ne sia accorto

    Se guardi bene .... ti accorgi che per il dispose del button fai riferimento all'istanza predefinita del form (quella su cui quindi stai lavorando) ed il button sparisce dal form....successivamente crei una nuova istanza del form al quale fai riferimento per puntare la textbox ..... che non sarà mai la stessa del form che hai aperto.
    Dovresti, semplicemente, usare lo stesso coidce che usi per il button anche per la textbox.
    Quindi:

    codice:
    MainForm.bottone1.Dispose();
    MainForm.textBox1.Dispose();
    Facci sapere....
    Ciao
    Grazie innanzitutto per la risposta

    Se usassi MainForm.textBox1.Dispose() farei riferimento ad un oggetto statico, ma che statico non è, per cui il compilatore segnala errore!
    Col bottone funziona, perché ovviamente è stato tipizzato come statico, ma con la textbox non funzionerà mai da un'altra classe, in quanto non essendo (la textbox) statica, ha bisogno di essere istanziata nella classe chiamante mediante istanziazione della classe stessa (MainForm)... ho capito ciò che dici: se faccio così, istanzio una nuova MainForm, e quando "disposo" i suoi oggetti, li elimino dalla nuova istanza, e non dal MainForm già esistente. In realtà, non ci avevo pensato, preso dalla foga di provare il C#, mea culpa :P Ma non esistono altri metodi per creare semplicemente una GUI? Sicuramente si, solo che sono veramente un niubbissimo sul .NET
    Ad ogni modo... non credo sia normale utilizzare oggetti statici quando non dovrebbero esserlo. Io preferirei creare un gestore della GUI che si occupi della pulizia o dell'aggiunta di oggetti... una sorta di delegate!

  4. #4
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    semplice.. in controllatextbox passi un riferimento alla form

    è sbagliato affidarsi a campi statici o campi pubblici per fare certe cose..

    il bottone statico è un errore di forma..

    se devi fare modifiche ad una form da una classe esterna o le passi un riferimento e fai le cose dirette (mettendo i controlli pubblici, anche se è poco elegante) o utilizzi un riferimento e, nella form, fai dei metodi di aggiornamento di interfaccia..

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    121
    Originariamente inviato da Stoicenko
    semplice.. in controllatextbox passi un riferimento alla form

    è sbagliato affidarsi a campi statici o campi pubblici per fare certe cose..

    il bottone statico è un errore di forma..

    se devi fare modifiche ad una form da una classe esterna o le passi un riferimento e fai le cose dirette (mettendo i controlli pubblici, anche se è poco elegante) o utilizzi un riferimento e, nella form, fai dei metodi di aggiornamento di interfaccia..
    Si, è proprio quello che volevo evitare, infatti!
    Non ho idea, però, di come passare per riferimento... potresti farmi un breve esempio?

  6. #6
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    in c# è tutto un riferimento.. oppure usi la parola chiave ref

  7. #7
    ma il tuo scopo è rimuovere gli oggetti dalla form?
    Oppure solo nasconderli?
    il metodo Remove dalla collezione dei controlli non funziona? (chiedo perche non ho mai provato)

  8. #8
    Calma Calma ...... non facciamo confusione .... tu mi parli di statico o non statico (che per me, praticante del Vb, significa condiviso o non condiviso) ma in realtà per poter eliminare degli oggetti dal form, significa che il form esiste, pertanto esiste un'istanza del form al quale far riferimento per puntare ai controlli in esso presenti.....Non hai bisogno di dichiarare nulla statico.
    Prova a dare un'occhio alla tua sub Main (la routine presente nel file application.cs) .... potresti capire ciò che ti serve sapere.

    Facci sapere.....
    Ciao

  9. #9
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    121
    Originariamente inviato da Max Mercury
    ma il tuo scopo è rimuovere gli oggetti dalla form?
    Oppure solo nasconderli?
    il metodo Remove dalla collezione dei controlli non funziona? (chiedo perche non ho mai provato)
    Non conosco il metodo Remove... ad ogni modo credo che abbia bisogno di un riferimento dinamico! Oppure, se mi posti un esempio potrei capire...

    Calma Calma ...... non facciamo confusione .... tu mi parli di statico o non statico (che per me, praticante del Vb, significa condiviso o non condiviso) ma in realtà per poter eliminare degli oggetti dal form, significa che il form esiste, pertanto esiste un'istanza del form al quale far riferimento per puntare ai controlli in esso presenti.....Non hai bisogno di dichiarare nulla statico.
    Prova a dare un'occhio alla tua sub Main (la routine presente nel file application.cs) .... potresti capire ciò che ti serve sapere.
    In realtà, in informatica, un tipo statico è un tipo di dato che non DOVREBBE cambiare il suo valore (inteso come tipo!) fino alla sua morte/distruzione (esempio: un dato String deve restare String). Per questo è un errore dichiarare oggetti di tipo GUI (vedi i bottoni, ad esempio) come statici (anche se spesso è l'ultima spiaggia, e funziona!). Un valore di tipo dinamico è un tipo che può modificare il suo tipo a run-time... ma qui entriamo nel polimorfismo e teorie varie che adesso non ci interessano
    Non ho idea di come funzioni nel VB!
    Proverò a guardare nella sub Main, anche se temo incontrerò qualche difficoltà :P

  10. #10
    Originariamente inviato da atsap
    Non conosco il metodo Remove... ad ogni modo credo che abbia bisogno di un riferimento dinamico! Oppure, se mi posti un esempio potrei capire...
    prova a dare un occhiata a
    How to: Add to or Remove from a Collection of Controls at Run Time

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.