Form in primo piano

di il
9 risposte

Form in primo piano

Salve a tutti, sto muovendo i primi passi con C#, e subito si presentano i primi problemi.
Ho 2 form Form1 e Form2, nella Form1 vi è un pulsante che fà comparire la Form2, posto il codice utilizzato:

Codice: Seleziona tutto
private void button6_Click(object sender, EventArgs e)
{
Form2 nuovaForm = new Form2();
if (Class1.aperto==false)
{
nuovaForm.Show();
Class1.aperto = true;
}
else {
}
this.TopMost = false;
nuovaForm.TopMost = true;
}



Avvio il software e compare la Form1, clicco sul pulsante e compare pure la Form2, adesso però se clicco sulla Form1 succede che questa viene portata in primo piano, e la form2 scompare dietro.
La Form2 rimane aperta ma adesso è dietro alla Form1 quindi non visualizzabile e quindi non utilizzabile.
Come fare per riportare la Form2 in primo piano davanti alla Form1?
Cercando in giro, la soluzione dovrebbe essere quella da me utilizzata, ovvero TopMost=true per portare una Form in primo piano, ma non mi funziona.
Qualcuno è in grado di aiutarmi?
Grazie.

9 Risposte

  • Re: Form in primo piano

    Perché non usi ShowDialog()?
  • Re: Form in primo piano

    candaluar ha scritto:


    Perché non usi ShowDialog()?
    Perchè ShowDialog() non mi permette di passare da un form all'altro.
    Showdialog apre un Form che rimane in primo piano e attivo fino a quando non viene chiuso, rendendo quindi inutilizzabile il form principale.
    Io ho necessità di tenere aperti tutti e due i form, e poter lavorare su tutte e due i form, senza doverli chiudere.
  • Re: Form in primo piano

    NuovaForm, l'istanza di Form2, dovrebbe essere un membro di Form1 e non una variabile locale; dovrebbe essere istanziata una volta sola, non ad ogni click. Intanto metti a posto queste cose e poi riprova (e riposta il codice).
  • Re: Form in primo piano

    C'è anche questa soluzione https://stackoverflow.com/questions/675105/how-do-you-make-a-non-modal-topmost-dialog-that-is-only-topmost-in-regards-to-th dove il form "figlio" è sempre in primo piano rispetto al "padre".
    Comunque, in qualsiasi caso, devi prima mettere a posto le parti che ti ho segnalato.
  • Re: Form in primo piano

    @GianlucaB

    il tuo codice a me funziona benissimo.
    Quello che invece non capisco è la parte
    else
    Devi formattare il codice utilizzando il pulsante Code (come indicato nel Regolamento) così si mantiene l'indentazione e il codice è leggibile.
  • Re: Form in primo piano

    Intanto grazie a tutti per le risposte.
    Dunque come mi è stato suggerito, ho spostato l'istanza di Form2 fuori dall'evento click, in modo da essere istanziata una sola volta.
    Ancora però non funzionava, la Form2 rimaneva sempre in primo piano perchè ora non venendo più istanziata, la sua proprietà TopMost una volta impostata su true rimaneva tale, tenendo bloccata la form2 in primo piano.

    Alla fine ho risolto così:
    
    
    private void button6_Click(object sender, EventArgs e)
            {
               
                if (Class1.aperto==false) 
                {
                   
                    nuovaForm.Show();                
                    Class1.aperto = true;            
    
    
                }
                else {
                    nuovaForm.Activate();
                   
                }
    
    
    Per chi me lo ha chiesto, l'else serve proprio a far riapparire la form2 che altrimenti potrebbe rimanere nascosta dietro alla form1.
    Se prendo la form2 (che è più piccola della form1), la trascino sopra la form1, e poi clicco in un punto della form1, la form1 viene portata in primo piano, e quindi la form2 finisce nascosta dietro.

    In pratica se la form2 è chiusa la apro, se invece è già aperta allora la porto in primo piano (nuovaForm.Activate();)
  • Re: Form in primo piano

    Scusate ragazzi, pensavo di aver risolto, ma evidentemente non avevo provato bene l'applicazione.
    Allora portando fuori dall'evento click l'istanza form2, tutto funziona fino a quando non chiudo il form2.
    Quando chiudo il form2 e tento di riaprirlo nuovamente con il click sul pulsante, il comando nuovaForm.Show(); genera un errore:

    Eccezzione non gestita
    System.ObjectDisposedException: 'Impossibile accedere a un oggetto eliminato.'

    Se il comando Form2 nuovaForm = new Form2(); lo metto dentro all'evento click, posso chiudere e riaprire il form2 quante volte voglio, ma mi smette di funzionare nuovaForm.Activate(); ovvero non riesco più a portare il form2 in primo piano.

    Non sò cosa fare
  • Re: Form in primo piano

    Riporta il codice...
  • Re: Form in primo piano

    Per semplificare le cose, e provare questa cosa delle form, ho creato un piccolo progetto.
    
    namespace testForm
    {
       
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                
            }
    
            Form2 nuovaForm = new Form2();
    
            private void button1_Click(object sender, EventArgs e)
            {
               
                nuovaForm.Show();
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                
                nuovaForm.Activate();
            }
        }
    }
    
    Allora c'è una form1 con 2 button
    Il button1 apre una nuova form, il button2 attiva la nuova form portandola quindi in primo piano, qualora fosse finita dietro alla form1.

    In questo modo funziona, la nuova form viene portata in primo piano, la posso trascinare dove voglio, e farla riapparire qualora fosse finita dietro alla form1
    Il problema con questo codice è che non posso chiudere e riaprire la nuova form, se la chiudo quando clicco sul button1 per aprirla nuovamente mi viene generato l'errore sull'istruzione nuovaForm.Show();

    Eccezzione non gestita
    System.ObjectDisposedException: 'Impossibile accedere a un oggetto eliminato.


    Il problema credo di aver capito che prima di aprire la nuova form, la devo nuovamente instanziare con l'istruzione Form2 nuovaForm = new Form2();

    Però mettendo questa istruzione dentro all'evento click dei button mi smette di funzionare l'istruzione per far riapparire la form in primo piano
    All'interno dell'evento click button2, ho provato a mettere:
    nuovaForm.Activate();
    nuovaForm.TopMost = true;
    nuovaForm.BringToFront = true;

    Nessuna di queste istruzioni funzionano se instanzio la nuova form all'interno dell'evento click

    Riassumendo se l'istrzuzione per isntanziare la nuova form Form2 nuovaForm = new Form2() la tengo fuori dall'evento click, mi si genera l'errore di cui sopra, se la metto dentro all'evento click mi smettono di funzionare tutte le istruzioni per portare in primo piano la nuova form.
Devi accedere o registrarti per scrivere nel forum
9 risposte