8
votes

Comment éviter de multiples instances de formulaire Windows dans C #

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.


0 commentaires

12 Réponses :


10
votes

Implémentez le modèle Singleton

Un exemple: CodeProject: Formulaires Singleton simples (OK, C'est dans vb.net, mais juste pour vous donner un indice)


3 commentaires

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.



-2
votes

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;
}


1 commentaires

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.



9
votes

Oui, il a un modèle singleton,

code pour créer un objet singleton, xxx

invoquer / afficher ce formulaire, xxx < / pré>


0 commentaires

-1
votes

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.


1 commentaires

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.



0
votes

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);
    }
}


0 commentaires

0
votes

Essayez ce code

class AnotherClass
{
    public void Event()
    {
        if(ClassName.Count <= 1)
        {
            ClassName classname=new ClassName();
        }
    }
}


0 commentaires

0
votes

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;
    }


0 commentaires

8
votes

Lorsque vous affichez la boîte de dialogue, utilisez simplement .Showdialog (); au lieu de .Show ();


2 commentaires

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.



4
votes

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;
    }


1 commentaires

Bel article. Résolu mon problème



0
votes

Vérifiez cette lien : xxx


0 commentaires

0
votes

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;
        }
    }


0 commentaires

0
votes
 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;
    }

0 commentaires