我有一个winforms应用程序,其中包含一个管理表单(称为'adminForm')和另一个表单(称为'userForm'),该表单位于打开并在设定的时间间隔内运行的计时器上。
如何在adminForm打开时阻止userForm打开?
直到最近,在这样的代码中使用'MainWindowTitle'值阻止了userFrom的打开:
// Retrieving all running processes for checking admin interface running or not
Process[] objArrPrs = Process.GetProcesses();
foreach (Process objProces in objArrPrs)
{
string strMainWindowTitle = string.Empty;
strMainWindowTitle = objProces.MainWindowTitle.ToString();
if (strMainWindowTitle != string.Empty || strMainWindowTitle != "")
{
// Retrievig process name
string strProcess = objProces.ProcessName;
if ((strMainWindowTitle == "XXXXX" && strProcess == "XXXXX")
|| ((strMainWindowTitle == "XXXXX" && strProcess == "XXXXX.vshost")))
{
blnAdminScrOpen = true;
break;
}
}
}
其中“XXXXX”是adminForm.Text值(例如,'this.Text =“XXXXX”)。这种方法运行正常。
但是,这两个表单现在都已经过重新设计,并且没有表单标题栏,所以现在表单'Text值为null,上面显示的代码不再有效。
有没有人对新的c#策略有什么建议我可以用来阻止adminForm打开时userFrom打开?如果您能指出一些示例代码,我们将不胜感激。
干杯,
弗雷德里克enter code here
答案 0 :(得分:1)
如果表单来自同一个应用程序,请循环遍历所有打开的表单OpenForms并检查它们是否已打开。
检查所有进程不是一种非常好的检查方法,如果进程名称发生更改,可能很容易中断,例如
答案 1 :(得分:0)
您可以在表单上实现Singleton模式,然后获取adminForm的成员变量并检查其Visible
属性。如果您不熟悉Singleton模式,我可以提供代码。它基本上改变了你的类,因此只能有一个实例。它需要对现有代码进行一些修改,但最终会成为一个更清晰的解决方案。
单身人士模式的要点如下:
public class MyForm : Form
{
//this is used to keep a reference of the single
//instance of this class
private static MyForm _instance;
//your constructor is private, this is important.
//the only thing that can access the constructor is
//the class itself.
private MyForm()
{
//do stuff
}
public static MyForm GetInstance()
{
//the check to IsDisposed is important
//if the form is closed, the _instance variable
//won't be null, but if you return the closed
//form (ie, disposed form) any calls to the form
//class (ie, Show()) will throw in exception.
if (_instance == null || _instance.IsDisposed)
{
_instance = new MyForm();
}
return _instance;
}
//other code
}
您曾经这样做过:
MyForm f = new MyForm();
您现在可以这样做:
MyForm f = new MyForm.GetInstance();
答案 2 :(得分:0)
作为Tim所说的替代方法,您还可以实现一个静态类,其中包含对AdminForm主要实例的引用。例如:
public static class Global {
public static AdminForm AdminFormInstance { get; set; }
}
在AdminForm的构造函数中,您可以添加以下行:
public AdminForm() {
// -snip-
Global.AdminFormInstance = this;
}
然后,如果你需要检查它是否可见,只需检查Visible
属性:
if (Global.AdminFormInstance.Visible == false)
DoSomethingWhenItsNotVisible();
请记住,您的静态成员不是线程安全的,尽管您似乎没有进行任何多线程处理。