C# 如何避免在c中使用多个windows窗体实例#

C# 如何避免在c中使用多个windows窗体实例#,c#,singleton,C#,Singleton,如何避免在c#?中出现多个windows窗体实例??我只希望窗体的一个实例正在运行。因为有可能从我的应用程序的许多页面打开相同的表单。实现 例如:(好的,它在VB.NET中,但只是给你一个提示)你可以在打开表单之前检查现有的流程: using System.Diagnostics; bool ApplicationAlreadyStarted() { return Process.GetProcessesByName(Process.GetCurrentProcess.ProcessNam

如何避免在c#?中出现多个windows窗体实例??我只希望窗体的一个实例正在运行。因为有可能从我的应用程序的许多页面打开相同的表单。

实现


例如:(好的,它在VB.NET中,但只是给你一个提示)

你可以在打开表单之前检查现有的流程:

using System.Diagnostics;

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

我不知道GetProcessesByName方法是否受UAC或其他安全措施的影响。

是的,它有单例模式

创建单例对象的代码

public partial class Form2 : Form
{
 .....
 private static Form2 inst;
 public static Form2  GetForm
 {
   get
    {
     if (inst == null || inst.IsDisposed)
         inst = new Form2();
     return inst;
     }
 }
 ....
}
调用/显示此表单

Form2.GetForm.Show();

单例不是面向对象的。它们只是全局变量的对象版本。您可以做的是将表单类的构造函数设置为私有,这样就不会有人意外地创建其中一个。然后调用reflection,将ctor转换为public,并确保您只创建了一个实例。

如果您的系统可以为不同的实例数据显示相同类型的表单,那么您可以创建一个检查系统,该系统迭代所有现有的打开表单,查找唯一的实例数据标识符,然后重新显示找到的任何表单

e、 g.具有包含公共属性“CustomerUniqueID”的表单类“CustomerDetails”:

foreach(Form f in CurrentlyDisplayedForms)
{
    CustomerDetails details = f as CustomerDetails;
    if((details != null) && (details.CustomerUniqueUD == myCustomerID))
    {
        details.BringToFront();
    }
    else
    {
        CustomerDetails newDetail = new CustomerDetails(myCustomerID);
    }
}
我们还使用相同的机制自动强制刷新已编辑和保存客户数据的数据绑定。

试试这段代码

Public class MyClass
{
    //Create a variable named 
    public static int count = 0;
    //Then increment count variable in constructor
    MyClass()
    {
        count++;
    }
}
为上述类“MyClass”创建对象时,请检查大于1的计数值

class AnotherClass
{
    public void Event()
    {
        if(ClassName.Count <= 1)
        {
            ClassName classname=new ClassName();
        }
    }
}
另一个类
{
公开无效事件()
{

如果(ClassName.Count这是我在ShowForm()中的解决方案:


显示对话框时,只需使用
.ShowDialog();
而不是
.Show();

我在项目中应用的一个解决方案是将此表单再次置于前台:

    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;
    }
private bool checkWindowOpen(字符串windowName)
{
for(int i=0;i
windowName本质上是Windows窗体和窗体的类名 返回值可用于不创建新表单实例。

请检查以下内容:


这里有一个简单的方法

检查表单是否为空,或者是否已被释放。如果为真,我们将创建表单的新实例

否则,我们只显示已经运行的表单

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

请确保您重载FormClosing并检查关闭原因(如果原因是用户),然后隐藏表单并设置cancel=trueCodeProject链接已断开,并将重定向链接设置为@Feroz Khan谢谢。我编辑了我的答案。这是一个非常糟糕的主意!看看C#的“静态类”功能,或者只使用singleton模式。如果您阅读问题这不是一个单例应用程序,而是应用程序中的一个表单,可以从多个地方打开,只需要一个实例。非常优雅:)我喜欢在某些情况下,即使使用ShowDialog,也可以打开一个表单的多个实例。例如,从主表单的菜单,然后从notify图标的上下文菜单。很好的文章。解决了我的问题
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;
      }
   }
}
    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;
        }
    }