Допускается 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();
}