Éliminer la forme après la fermeture
J'ai eu le problème avec l'ouverture et la fermeture du formulaire en C#.
Mon problème est de savoir comment disposer la forme après la clôture .
voici mon code :
Programme.cs:
static class Program
{
public static Timer timer;
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
timer = new Timer { Interval = 1000};
timer.Start();
Application.Run(new Form1());
}
}
Form1.cs:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Form2 form = new Form2();
form.ShowDialog();
///I've tried Dispose() method . but didn't work
}
}
Form2.cs:
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void Form2_Load(object sender, EventArgs e)
{
Program.timer.Tick += timer_Tick;
Close();
//I've tried Dispose() method instead of Close() but didn't work
}
private int count = 0;
void timer_Tick(object sender, EventArgs e)
{
count++;
if (count == 5) MessageBox.Show("");
}
}
Édité :
Ma question est : pourquoi la boîte de message affiche au bout de 5 secondes lors de la form2 a fermé!
source d'informationauteur Mironline
Vous devez vous connecter pour publier un commentaire.
Edit: Cette question s'avère être sur de Disposer.
Tout d'abord, Jetez n'a rien à voir avec la collecte des ordures. La suite se passe:
Le principal point à comprendre est que Fermer/Jetez seulement changer le statut de la Forme, ils ne sont pas (ne peut pas) "supprimer" de l'instance. Si l' (fermé) la forme est là, le champ de compteur est toujours là, et l'Événement se déclenche.
OK, partie 1:
Un
using () {}
bloc serait mieux, mais cela devrait fonctionner:Si non, veuillez décrire "ne fonctionne pas".
C'est bizarre, mais je vais supposer que c'est artificiel code pour la question.
Votre Programme global.Minuterie maintenant stocke une référence à votre Form2 instance et va continuer d'être recueillies. Cela ne l'empêche pas d'être Éliminés/Fermez donc votre minuteur va continuer à tirer pour une Forme Fermée, et qui échouent en général et causer d'autres problèmes.
Program.timer.Tick -= timer_Tick;
La plus simple et la plus fiable pour disposer d'un
Form
après l'utilisation est de mettre de l'utilisation à l'intérieur d'un bloc usingL'aide du bloc en C# est un concept qui détaille ci-dessus dans le code suivant.
C'est une vieille question, mais elle touche certains points intéressants au sujet de la façon dont fonctionnent les objets. Un formulaire est, essentiellement, un objet. Tous les objets de la même classe partagent les mêmes méthodes, mais chacun a ses propres données. Qu'est-ce que cela signifie? Cela signifie que, de la fermeture ou de l'aliénation d'un objet n'est pas libre de/supprimer/supprimer tout code de la mémoire. Seules les données. Tout ce qui était sur les objets en général, peu importe la langue.
Maintenant, spécifiquement au sujet de votre code. Examinons ce que la ligne
Program.timer.Tick += timer_Tick;
. Cela donne un pointeur à ta fonction dans le objet de Formulaire à la objet timer. Donc, maintenant, peu importe ce que vous faites pour la objet de Formulairele objet timer gardera en appelant cette fonction. L'objet timer ne se soucient pas de votre Forme et n'est même pas conscient de l'existence de la Forme de l'objet. Il se soucie uniquement de la fonction que vous avez passé le pointeur de. Aussi loin que l'objet timer est concerné, cette fonction est une fonction autonome.Ce que ne Forme.Close ()? Forme.Close() dispose des ressources utilisées par le formulaire, aka, les marques, les contrôles du formulaire pour la collecte des ordures sauf le formulaire est affiché à l'aide de ShowDialog. Dans ce cas, d'en Disposer() doit être appelé manuellement. MSDN
Inutile de dire(ou peut-être pas si inutile) que si la fermeture/l'élimination de la forme désactivée la fonction de la mémoire, l'objet timer aurait un pointeur non valide et votre programme devrait crash au bout de 5 secondes.
Peut-être que je suis la lecture de la question mal, mais je pense que ces messieurs ont besoin de savoir que, pour fermer un formulaire (dire form2) ouvert comme Form2.ShowDialog(), vous devez définir Form2.DialogResult dans Form2. Il suffit de régler ce membre est tout ce qu'il faut pour fermer le formulaire et renvoyer le résultat.
forme.ShowDialog() affiche le formulaire sous la forme d'une boîte de dialogue modale. Cela signifie que l'appel n'a pas retourné jusqu'à ce que le Formulaire est fermé.
Notez qu'en cliquant sur le fermer X sur une boîte de dialogue modale ne ferme pas la forme, il vient se cache. Je suppose que c'est ce qui vous trouble.
Si vous voulez le code de form1 pour poursuivre l'exécution plutôt que de bloquer, vous devez appeler Show() au lieu de ShowDialog(). Non modal se ferme lorsque le X est cliqué.
Si vous ne voulez pas un blocage de la boîte de dialogue modale, vous devez entourer le formulaire à l'aide de bloc comme décrit dans les autres réponses.
Lors de la construction d'une boîte de dialogue modale vous pouvez généralement ajouter un bouton "OK" ou similaires et de définir la AcceptButton propriété de la forme pour que ce bouton pour permettre à l'utilisateur de fermer le formulaire en appuyant sur entrée. De même, vous pouvez ajouter un bouton "Annuler" et définir la CancelButton propriété de capturer la touche Esc.
Ajouter un gestionnaire de clic sur les deux boutons, définissez la propriété DialogResult de la forme en conséquence et appeler Close().