Comment éviter de multiples instances de formulaire Windows en C # ?? Je ne veux qu'une seule instance de la forme en cours d'exécution. Parce qu'il y a des chances d'ouvrir la même forme de nombreuses pages de mon application. P>
12 Réponses :
Implémentez le modèle Singleton P>
Un exemple: CodeProject: Formulaires Singleton simples (OK, C'est dans vb.net, mais juste pour vous donner un indice) p>
Assurez-vous que vous surchargez-vous et vérifiez la principale raison si la raison est que la raison est utilisateur puis masquez le formulaire et définissez Annuler = true.
CodeProject lien cassé et donne une liaison de redirection sous forme Essayez
@Feroz Khan merci. J'ai édité ma réponse.
Vous pouvez vérifier les processus existants avant d'ouvrir le formulaire:
using System.Diagnostics; bool ApplicationAlreadyStarted() { return Process.GetProcessesByName(Process.GetCurrentProcess.ProcessName).Length == 0; }
Si vous lisez la question, il ne s'agit pas d'une application Singleton, il s'agit d'un formulaire au sein de l'application qui peut être ouvert à partir de nombreux endroits et ne voulant que une instance.
Oui, il a un modèle singleton,
code pour créer un objet singleton, p> invoquer / afficher ce formulaire, p>
singletons ne sont pas orientés objet. Ils sont simplement la version objet des variables globales. Ce que vous pouvez faire est de faire le constructeur de la classe de format privée, de sorte que personne ne peut en créer accidentellement l'un d'entre eux. Appelez ensuite la réflexion, convertissez la CTOR en public et assurez-vous de créer une seule et une seule instance. P>
C'est une très mauvaise idée! Jetez un coup d'œil aux caractéristiques de la catégorie statique de C # ou utilisez simplement le modèle Singleton.
Si votre système a la possibilité de montrer le même type de formulaire pour différentes données d'instance, vous pouvez créer un système de contrôle qui itière toutes les formulaires ouvertes existantes, à la recherche d'un identifiant de données d'instance unique, puis à réafficher à nouveau.
par exemple Avoir une classe de formulaire 'ComputerDetails' qui contient une propriété publique «CustomerUniqueID»: P>
foreach(Form f in CurrentlyDisplayedForms) { CustomerDetails details = f as CustomerDetails; if((details != null) && (details.CustomerUniqueUD == myCustomerID)) { details.BringToFront(); } else { CustomerDetails newDetail = new CustomerDetails(myCustomerID); } }
Essayez ce code
class AnotherClass { public void Event() { if(ClassName.Count <= 1) { ClassName classname=new ClassName(); } } }
Voici ma solution dans ShowForm ():
private void ShowForm(Type typeofForm, string sCaption) { Form fOpen = GetOpenForm(typeofForm); Form fNew = fOpen; if (fNew == null) fNew = (Form)CreateNewInstanceOfType(typeofForm); else if (fNew.IsDisposed) fNew = (Form)CreateNewInstanceOfType(typeofForm); if (fOpen == null) { fNew.Text = sCaption; fNew.ControlBox = true; fNew.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; fNew.MaximizeBox = false; fNew.MinimizeBox = false; // for MdiParent //if (f1.MdiParent == null) // f1.MdiParent = CProject.mFMain; fNew.StartPosition = FormStartPosition.Manual; fNew.Left = 0; fNew.Top = 0; ShowMsg("Ready"); } fNew.Show(); fNew.Focus(); } private void aboutToolStripMenuItem_Click(object sender, EventArgs e) { ShowForm(typeof(FAboutBox), "About"); } private Form GetOpenForm(Type typeofForm) { FormCollection fc = Application.OpenForms; foreach (Form f1 in fc) if (f1.GetType() == typeofForm) return f1; return null; } private object CreateNewInstanceOfType(Type typeofAny) { return Activator.CreateInstance(typeofAny); } public void ShowMsg(string sMsg) { lblStatus.Text = sMsg; if (lblStatus.ForeColor != SystemColors.ControlText) lblStatus.ForeColor = SystemColors.ControlText; }
Lorsque vous affichez la boîte de dialogue, utilisez simplement .Showdialog (); code> au lieu de
.Show (); code> p> p>
très élégant :) j'aime bien
Il y a toujours des cas dans lesquels vous pouvez ouvrir plusieurs instances d'une forme, même lors de l'utilisation de ShowDialog. Par exemple, dans le menu du formulaire principal, puis du menu contextuel de l'icône de notification.
Une solution que j'ai appliquée à mon projet afin d'amener cette forme à nouveau au premier plan est la suivante:
private bool checkWindowOpen(string windowName) { for (int i = 0; i < Application.OpenForms.Count; i++) { if (Application.OpenForms[i].Name.Equals(windowName)) { Application.OpenForms[i].BringToFront(); return false; } } return true; }
Bel article. Résolu mon problème
Voici un moyen simple de le faire.
Vérifiez si le formulaire est null ou a été disposé. Si c'est vrai, nous créons une nouvelle instance du formulaire. P>
sinon nous indiquons simplement le formulaire déjà exécuté. P>
Form form; private void btnDesktop_Click(object sender, EventArgs e) { if (form == null || desktop.IsDisposed) { form = new Form(); form.Show(); } else { form.WindowState = FormWindowState.Normal; } }
private static MyForm _myForm; internal static MyForm form { get { if (_myForm == null) { _myForm = new MyForm(); } return _myForm; } } public MyForm() { InitializeComponent(); _myForm = this; } private void MyForm_FormClosed(object sender, FormClosedEventArgs e) { _myForm = null; }