Допускается Menustrip только один ребенок в данный момент

Как я могу разрешить только одно окно за раз, когда я щелкаю меню в меню?

Пример: у меня есть Menustrip Ordre, Tarif и т. Д.... когда я нажимаю на Ordre в первый раз, он открывает новую форму, но во второй раз я хочу запретить ее.

 private void ordresToolStripMenuItem_Click(object sender, EventArgs e)
    {

        if (Already open)
        {

        }
        else
        {
            Lordre newMDIChild = new Lordre(ClientId);
            // Set the Parent Form of the Child window.
            newMDIChild.MdiParent = this;
            // Display the new form.
            newMDIChild.Show();                
        }

    }

Заранее спасибо

4 ответа

Решение

Если вы хотите, чтобы форма создавалась только в первый раз, а затем показывать эту же форму при следующем выборе элемента меню, может сработать что-то подобное:

private Lordre orderForm = null;
private void ordresToolStripMenuItem_Click(object sender, EventArgs e)
{
    if (orderForm == null)
        orderForm = new Lordre(ClientId);
        // Set the Parent Form of the Child window.
        orderForm .MdiParent = this;

    }
    // Display the form.
    orderForm.Show(); 
    orderForm.Activate();
}

Спасибо вам всем за ваш ответ.

я нашел это

private void ordresToolStripMenuItem_Click(object sender, EventArgs e)
    {
        // a flag to store if the child form is opened or not
        bool found = false;   
        // get all of the MDI children in an array
        Form[] charr = this.MdiChildren;

        if (charr.Length == 0)     // no child form is opened
        {
            Lordre myPatients = new Lordre();
            myPatients.MdiParent = this;
            // The StartPosition property is essential
            // for the location property to work
            myPatients.StartPosition = FormStartPosition.Manual;
            myPatients.Location = new Point(0,0);
            myPatients.Show();
        }
        else     // child forms are opened
        {
            foreach (Form chform in charr)
            {
                if (chform.Tag.ToString() == "Ordre")  // one instance of the form is already opened
                {
                    chform.Activate();
                    found = true;
                    break;   // exit loop
                }
                else
                    found = false;      // make sure flag is set to false if the form is not found
            }

            if (found == false)    
            {
                Lordre myPatients = new Lordre();
                myPatients.MdiParent = this;
                // The StartPosition property is essential
                // for the location property to work
                myPatients.StartPosition = FormStartPosition.Manual;
                myPatients.Location = new Point(0,0);
                myPatients.Show();
            }
        }  
    }

это то, что я хочу, но это слишком много кода. Интересно, смогу ли я уменьшить его.

Я должен сделать это для каждого из моих стрипмену.

if (chform.Tag.ToString() == "Ordre")

if (chform.Tag.ToString() == "Another one")

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

Итак, переменная-член:

private TestForm myTestForm = null;

а затем, когда вы проверяете, просто проверьте, является ли оно нулевым; если нет, то при создании формы назначьте ее переменной-члену и присоедините к обработчику событий для события закрытия дочерней формы.

if (myTestForm != null)
{
   MessageBox.ShowDialog("Sorry, you already have a TestForm open!");
}
else
{
   myTestForm = new TestForm();
   myTestForm.FormClosing += myTestForm_FormClosing;
   myTestForm.MdiParent = this;
   myTestForm.Show();
}

и в закрывающем обработчике просто установите его обратно в ноль.

private void myTestForm_FormClosing(Object sender, FormClosingEventArgs e)
{
   myTestForm = null;
}

Кроме того, я провел небольшой поиск, и вместо того, чтобы иметь событие и обработчик FormClosing, вы можете просто изменить свое условие на:

if ((myTestForm != null) && (!myTestForm.IsDisposed())

Может быть, что-то вроде этого:

public class MyForm
{
    private Window _openedWindow;
    private void ordresToolStripMenuItem_Click(object sender, EventArgs e)
    {

        if ( _openedWindow != null &&  _openedWindow.Open)
        {
            //
        }
        else
        {
            Lordre newMDIChild = new Lordre(ClientId);
            _openedWindow = newMDIChild;
            // Set the Parent Form of the Child window.
            newMDIChild.MdiParent = this;
            // Display the new form.
            newMDIChild.Show();                
        }
    }
}

Это было написано полностью в браузере, и я давно не писал приложение для Windows, поэтому точные классы и свойства могут отличаться.

Я делаю это, сначала сохраняя экран в переменной в таком классе:

private Lordre _LordreChildForm = new Lordre(ClientID)

Затем создайте для него свойство:

public Lordre LordreChildForm { get => _LordreChildForm; set => _LordreChildForm = 
value; }

Затем в событии закрытия формы установите значение null следующим образом:

private void Lordre_FormClosing(object sender, FormClosingEventArgs e)
{
            ClassName.LordreChildForm= null;
}

Теперь, наконец, вы можете установить оператор if в обработчике события нажатия кнопки следующим образом:

private void LordreToolStripMenuItem_Click(object sender, EventArgs e)

{
    if(ClassName.LordreChildForm== null || ClassName.LordreChildForm.IsDisposed)
    {
        ClassName.LordreChildForm= new DeregisterClub();
        ClassName.LordreChildForm.MdiParent = this;
    }
    LordreChildForm.Dock = DockStyle.Fill;
    LordreChildForm.Show();
    LordreChildForm.Focus();
}

Другие вопросы по тегам