Запретить открытие формы Form2, когда форма Form1 открыта без использования MainWindowTitle - PullRequest
1 голос
/ 08 июля 2010

У меня есть приложение winforms, которое включает в себя форму администрирования (назовите ее «adminForm») и другую форму (назовите ее «userForm»), которая находится в таймере, который открывается и запускается через заданный интервал времени.

Как предотвратить открытие пользовательской формы при открытой форме adminForm?

До недавнего времени было запрещено открывать userFrom, используя значение «MainWindowTitle» в коде, подобном следующему:

           // 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"). Этот метод работал нормально.

Однако обе формы теперь были переработаны, и в них нет заголовков форм, поэтому теперь текстовые значения форм являются нулевыми, а приведенный выше код больше не работает.

Есть ли у кого-нибудь предложения по новой стратегии c #, которую я могу использовать, чтобы запретить открытие userFrom при открытии adminForm? Буду признателен, если вы укажете мне пример кода.

Cheers, Фредерик enter code here

Ответы [ 3 ]

1 голос
/ 08 июля 2010

Если обе формы принадлежат одному приложению, вместо этого переберите все открытые формы OpenForms и проверьте, открыты ли они.

Проверка всех процессов не очень хороший способ проверки и может легко сломаться при изменении имени процесса, например

0 голосов
/ 08 июля 2010

В качестве альтернативы тому, что сказал Тим, вы также можете реализовать статический класс со ссылкой на основной экземпляр вашей AdminForm.Например:

public static class Global {
    public static AdminForm AdminFormInstance { get; set; }
}

В конструкторе для вашей AdminForm вы можете добавить эту строку:

public AdminForm() {
    // -snip-
    Global.AdminFormInstance = this;
}

А затем, если вам нужно проверить, видна ли она, просто отметьте Visible property:

if (Global.AdminFormInstance.Visible == false)
    DoSomethingWhenItsNotVisible();

Имейте в виду, что ваш статический член не является потокобезопасным, хотя не похоже, что вы выполняете какую-либо многопоточность.

0 голосов
/ 08 июля 2010

Вы можете реализовать шаблон 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...