Frage

Wie mehrere Instanzen von Windows-Formular in c # vermeiden ?? Ich möchte nur eine Instanz der Form läuft. Da gibt es Chancen, die gleiche Form von vielen Seiten meiner Anwendung zu öffnen.

War es hilfreich?

Lösung

implementieren, um die Singletonmuster

Ein Beispiel: Codeproject: Einfacher Singleton Forms (ok, es ist in VB .NET, aber nur, um Ihnen einen Anhaltspunkt)

Andere Tipps

Ja, es Singletonmuster hat,

-Code ein Singleton-Objekt zu erstellen,

public partial class Form2 : Form
{
 .....
 private static Form2 inst;
 public static Form2  GetForm
 {
   get
    {
     if (inst == null || inst.IsDisposed)
         inst = new Form2();
     return inst;
     }
 }
 ....
}

Invoke / Zeigen Sie dieses Formular,

Form2.GetForm.Show();

Wenn Sie den Dialog anzuzeigen verwenden Sie einfach .ShowDialog(); statt .Show();

Eine Lösung, die ich an mein Projekt angelegt, um diese Form zu bringen, wieder im Vordergrund steht:

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

window ist im Wesentlichen der Klassenname des Windows Form und Rückgabewert kann für nicht die Schaffung einer neuen Formularinstanz verwendet werden.

Wenn Ihr System hat die Möglichkeit, die gleiche Art von Form für verschiedene Instanzdaten zeigen, dann könnten Sie ein Kontrollsystem erstellen, das alle bestehenden offene Formen iteriert, auf der Suche nach einer einzigartigen Datenkennung Instanz und dann ein beliebigen gefundene Form erneut angezeigt werden soll.

z. mit einer Formularklasse ‚Kundendetails‘, die eine öffentliche Eigenschaft enthält ‚CustomerUniqueID‘:

foreach(Form f in CurrentlyDisplayedForms)
{
    CustomerDetails details = f as CustomerDetails;
    if((details != null) && (details.CustomerUniqueUD == myCustomerID))
    {
        details.BringToFront();
    }
    else
    {
        CustomerDetails newDetail = new CustomerDetails(myCustomerID);
    }
}

Wir verwenden auch den gleichen Mechanismus, um automatisch Auffrischungen von Daten zu erzwingen verbindlich, wenn die Daten eines Kunden wird bearbeitet und gespeichert werden.

Hier ist meine Lösung in 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;
    }

lesen Sie in diesem Link :

using System;

public sealed class Singleton
{
   private static volatile Singleton instance;
   private static object syncRoot = new Object();

   private Singleton() {}

   public static Singleton Instance
   {
      get 
      {
         if (instance == null) 
          {
            lock (syncRoot) 
            {
               if (instance == null) 
                  instance = new Singleton();
            }
         }

         return instance;
      }
   }
}

Versuchen Sie diesen Code

Public class MyClass
{
    //Create a variable named 
    public static int count = 0;
    //Then increment count variable in constructor
    MyClass()
    {
        count++;
    }
}

Während das Objekt für die obige Klasse zu schaffen ‚MyClass‘ überprüfen den Zählwert größer als 1

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

Hier ist eine einfache Möglichkeit, es zu tun.

Überprüfen Sie, ob die Form null ist, oder beseitigt wurden. Wenn das stimmt schaffen wir eine neue Instanz des Formulars.

Ansonsten nur zeigen wir die bereits laufende Form.

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

Singletons sind nicht objektorientiert. Sie sind einfach die Objektversion von globalen Variablen. Was können Sie tun, ist der Konstruktor der Form-Klasse privat zu machen, so dass niemand versehentlich eine davon erstellen können. Dann in Reflexion nennen, den Ctor zu öffentlichen konvertieren und stellen Sie sicher, dass Sie erstellen und nur eine Instanz davon.

Sie können die vorhandenen Prozesse überprüfen, bevor das Formular zu öffnen:

using System.Diagnostics;

bool ApplicationAlreadyStarted()
{
  return Process.GetProcessesByName(Process.GetCurrentProcess.ProcessName).Length == 0;
}

Ich weiß nicht, ob die GetProcessesByName Methode durch UAC oder andere Sicherheitsmaßnahmen betroffen ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top