View Full Version : [C#]aprire una nuova form
Salve a tutti,
vorrei sapere come fare ad aprire una nuova form in linguaggio C#. Mi spego meglio: quando avvio il mio programmino vorrei che facendo eseguire un evento come il click di un bottone si aprisse una seconda form precedentemente creata e si chiudesse la precedente.
Spero di essere stato chiaro.
Grazie ...
Fenomeno85
31-01-2010, 10:25
cosa semplicissima:
ipotizziamo che abbiamo due form:
1) frmStart (form di avvio)
2) frmClick (form nuova)
Allora quando devi generare l'evento, qualunque esso sia (bottone, tastiera etc)
scrivi:
frmClick nuovaFinestra = new frmClick ();
frmClick.Activate();
frmClick.Show();
this.Close();
Se hai dubbi o vuoi sapere altro chiedi pure.
~§~ Sempre E Solo Lei ~§~
Mi da errore :
An object reference is required for the nonstatic field, method, or property 'System.Windows.Forms.Form.Activate()' C:\Users\Luca\AppData\Local\Temporary Projects\WindowsApplication1\Form1.cs 21 13 WindowsApplication1
su Active e show. Come mai?
Fenomeno85
31-01-2010, 15:23
Mi da errore :
su Active e show. Come mai?
mi posti il codice completo?
~§~ Sempre E Solo Lei ~§~
Ora mm posso postartelo ma e' quello che mi hai dato, naturalmente con i nomi delle mie form
Fenomeno85
31-01-2010, 16:37
Ora mm posso postartelo ma e' quello che mi hai dato, naturalmente con i nomi delle mie form
si sto guardando ora il codice che ti ho messo
devi mettere il nome dell'oggetto istanziato non la classe :D .. scriverla così mi ha tradito :)
~§~ Sempre E Solo Lei ~§~
Fenomeno85
01-02-2010, 09:04
Quindi? Come devo fare?
frmClick nuovaFinestra = new frmClick ();
nuovaFinestra.Activate();
nuovaFinestra.Show();
this.Close();
~§~ Sempre E Solo Lei ~§~
Domani lo provo ... ti diró ...
Con questi codici si chiudo entrambe le finestre
Con questi codici si chiudo entrambe le finestre
metti il this.close sul pulsante di chiusura della finestra figlia
Fenomeno85
03-02-2010, 12:34
metti il this.close sul pulsante di chiusura della finestra figlia
scusa ma quel codice va solo nel bottone o metodo che sta all'interno della finestra madre oO
~§~ Sempre E Solo Lei ~§~
vorrei sapere come fare ad aprire una nuova form in linguaggio C#. Mi spego meglio: quando avvio il mio programmino vorrei che facendo eseguire un evento come il click di un bottone si aprisse una seconda form precedentemente creata e si chiudesse la precedente.
Stando così le cose non puoi, nel senso che se nella tua Applicazione WinForms hai solo queste 2 Form, la chiusura della prima delle due provoca l'uscita dal thread main.
Con ogni probabilità in Program.cs hai questo :
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
Application.Run(new Form1()); è il motivo per cui non puoi "chiudere" la Form1 dopo che hai aperto Form2.
Se esegui questo da un pulsante posto su Form1 :
Form2 Frm2 = new Form2();
Frm2.Show();
this.Close();
funziona, ma ovviamente chiude tutto.
Se invece esegui questo :
Form2 Frm2 = new Form2();
Frm2.Show();
this.Hide();
funziona come vorresti, ma poi hai il problema di ripescare la visibilità di Form1 alla chiusura di Form2, come penso tu voglia fare...
La soluzione migliore in un'applicazione multi-Forms, e anche la più elegante, è di lanciare come Form-base iniziale una Form MDI, la cui chiusura provoca l'uscita dal programma, e a quel punto potrai aprire Form2, chiudere Form1, e riprenderlo alla chiusura di Form2... ;)
Fenomeno85
03-02-2010, 13:20
giusto non avevo pensato che era nel form principale oO
~§~ Sempre E Solo Lei ~§~
Ora l' algoritmo funziona ma vorrei sapere una cosa. A cosa serve l' istruzione Hide? Perche anche se chiudo il programma, esso rimane ancora aperto.
Ora l' algoritmo funziona ma vorrei sapere una cosa. A cosa serve l' istruzione Hide? Perche anche se chiudo il programma, esso rimane ancora aperto.
Come suggerisce il nome stesso .Hide() nasconde il controllo all'utente, ma NON lo chiude. Perciò se fai this.Hide(); sulla Form di avvio, il programma è ancora attivo.
Mi intrometto per fare una domanda penso attinente.
L'alternativa sarebbe associare il programma alla procedura main(), e non al form1, in modo tale che il programma può continuare anche senza form.
Ma da qualche parte stavo leggendo (ma non ho capito bene) che il framework è progettato in modo che ogni programma sia associato per forza ad un form.
Ho capito male?
In pratica il metodo che consigliate per risolvere il dubbio di pare93 è di nascondere il primo form con hide() ? Oppure è meglio fare una routine senza form principale ( la main() ) che gestisce i form?
L'alternativa sarebbe associare il programma alla procedura main(), e non al form1, in modo tale che il programma può continuare anche senza form.
Non capisco che senso abbia creare un'applicazione Windows Forms, che possa rimanere aperta senza che vi sia alcun Form visibile... :mbe:
Anche perchè, senza UI, come fai a chiuderla poi ? Vai di Task Manager ?
Ma da qualche parte stavo leggendo (ma non ho capito bene) che il framework è progettato in modo che ogni programma sia associato per forza ad un form.
Ho capito male?
No. Succede solo se si crea un'applicazione Windows Forms. In tal caso nel Main() viene già predisposto Application.Run(new Form1());, che, come da MSDN, "Avvia l'esecuzione di un ciclo di messaggi dell'applicazione standard sul thread corrente."
Del resto non avrebbe alcun senso prevedere un'applicazione Windows Forms senza Forms. A sto punto si crea un'applicazione Console, una Library, ecc...
In pratica il metodo che consigliate per risolvere il dubbio di pare93 è di nascondere il primo form con hide() ? Oppure è meglio fare una routine senza form principale ( la main() ) che gestisce i form?
Come già detto la regola sarebbe avere una Form di livello superiore, ossia "contenitore" per le altre Forms, quindi una MDI Form.
Se si omette la MDI, è ovvio che la Form di avvio Form1 non va mai chiusa.
Se si vuole perseverare nella scelta di poter chiudere o nascondere la Form di avvio Form1, una strada possibile, che personalmente non sceglierei, è questa :
> Classe "Forms" :
public static class Forms
{
public static Form1 Frm1;
}
> Main() :
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Forms.Frm1 = new Form1();
Application.Run(Forms.Frm1);
}
> Apro Form2 da Form1 :
Form2 Frm2 = new Form2();
Frm2.Show();
this.Hide();
> Chiudo Form2 e ripristino Form1 :
Forms.Frm1.Show();
this.Close();
una soluzione non potrebbe anche "appoggiare" creazione e gestione del form secondario su un thread indipendente?
una soluzione non potrebbe anche "appoggiare" creazione e gestione del form secondario su un thread indipendente?
Non vedo come potrebbe risolvere il caso specifico dell'utente che ha aperto la discussione. Bisognerebbe comunque andare a ripescare la visibilità della Form1, oltretutto questa volta dovendo gestire anche il cross-thread... O sbaglio ?
Non vedo come potrebbe risolvere il caso specifico dell'utente che ha aperto la discussione. Bisognerebbe comunque andare a ripescare la visibilità della Form1, oltretutto questa volta dovendo gestire anche il cross-thread... O sbaglio ?
giusto non avevo letto del fatto che voleva che poi l'altr si chiudesse
Dentro la AppStart.cs dovrebbe essere sufficiente cambiare la
proprieta' ShutdownMode di Application
Per default e' OnMainWindowClose.
La si puo' passare a OnLastWindowClose
e si puo' in seguito agire come da primi post, aprendo una nuova form e chiudendo la prima originale.
Quando la seconda form sara' chiusa (quando non ci saranno piu' form aperte in realta'), automaticamente l'applicazione passera' allo shutdown.
Scusate se non ho più risposto ;)
Non ho capito bene una cosa:
ora io vorrei aprire una form che chiameremo form1 e attraverso un evento di essa aprire una nuova form chiamata form2.
Ora, ho capito che la prima form è la form 'madre' mentre l' altra è quella 'figlia' quindi la seconda è legata alla prima e di conseguenza si chiudono tutte e due.
Ho provato con una form MDI ma anche essa si chiude con l' altra.
E ho provato inoltra ad avviare la seconda form, nascondere la prima, poi far ricomparire la prima e chiudere entrambe.
Quindi non so darne fuori anche perchè non ho capito molto bene le risposte che mi avate dato in precedenza.
Chi mi da una mano?
Grazie mille ...
up
Si farebbe prima se spiegassi chiaramente COSA vuoi fare.
Se stai riproponendo il post d'apertura, personalmente ti ho già risposto ( miei post #13 e #18 ).
Ho cercato di seguire il tuo congilio però mi da errore.
Ti riporto tutto:
Nel program.cs
namespace WindowsFormsApplication1
{
static class Program
{
public static class Forms
{
public static Form1 Frm1;
}
/// <summary>
/// Punto di ingresso principale dell'applicazione.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Forms.Frm1 = new Form1();
Application.Run(Forms.Frm1);
}
}
}
Nella form1:
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
Form2 Frm2 = new Form2();
Frm2.Show();
this.Hide();
}
}
}
Nella form2:
namespace WindowsFormsApplication1
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Forms.Frm1.Show();
this.Close();
}
}
}
Ti chiedo scusa ma in questo caso io sono proprio ignorante ...
Allora hai seguito il consiglio al post #18.
Però nel codice che hai postato non vedo alcuna classe statica Forms.
public static class Forms
{
public static Form1 Frm1;
}
Inoltre, quando si dice "mi da errore"... DOVE ?
ok grazie mille risolto!!!
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.