Как проверить, открыта ли форма для Windows, и закрыть ее, если она есть?
У меня есть форма "fm", которая представляет собой простое информационное окно, которое открывается каждые 10 минут (fm.Show();
).
Как я могу сделать так, чтобы каждые 10 минут он проверял, открыта ли форма "fm", и если она открыта, она закрывает ее и открывает снова!
Теперь форма fm всегда создается с form fm = new form();
поэтому, когда я пытаюсь проверить, открыта ли форма, она всегда будет ложной и откроет новое окно, даже если раньше была одна форма!
Мне нужен инструмент, чтобы присвоить ему уникальную личность, а затем проверить, открыта ли эта форма с уникальной личностью или нет!
Я не хочу просто обновлять данные в форме (FM), потому что у меня есть сложная информация с кнопками.
Имя формы "UpdateWindow"
Спасибо
Ответы
Ответ 1
возможно это поможет:
FormCollection fc = Application.OpenForms;
foreach (Form frm in fc)
{
//iterate through
if (frm.Name == "YourFormName")
{
bFormNameOpen = true;
}
}
Некоторый код в foreach для определения конкретной формы, и это может быть сделано. Не проверено, хотя.
Найдено на http://bytes.com/topic/c-sharp/answers/591308-iterating-all-open-forms
Ответ 2
Я знаю, что опаздываю... Но для тех, кому интересно... Это еще один способ
if (Application.OpenForms.OfType<UpdateWindow>().Count() == 1)
Application.OpenForms.OfType<UpdateWindow>().First().Close();
UpdateWindow frm = new UpdateWindow()
frm.Show();
Ответ 3
Предположим, если мы вызываем форму из меню, кликаем по форме MDI, тогда нам нужно создать объявление экземпляра этой формы на верхнем уровне следующим образом:
Form1 fm = null;
Затем нам нужно определить событие щелчка меню для вызова Form1 следующим образом:
private void form1ToolStripMenuItem_Click(object sender, EventArgs e)
{
if (fm == null|| fm.Text=="")
{
fm = new Form1();
fm.MdiParent = this;
fm.Dock = DockStyle.Fill;
fm.Show();
}
else if (CheckOpened(fm.Text))
{
fm.WindowState = FormWindowState.Normal;
fm.Dock = DockStyle.Fill;
fm.Show();
fm.Focus();
}
}
CheckOpened, установленный для проверки Form1, уже открыт или нет:
private bool CheckOpened(string name)
{
FormCollection fc = Application.OpenForms;
foreach (Form frm in fc)
{
if (frm.Text == name)
{
return true;
}
}
return false;
}
Надеемся, что это решит проблемы при создании нескольких экземпляров формы, также получив фокус на Form1 при щелчке по меню, если он уже открыт или сведен к минимуму.
Ответ 4
Я не уверен, что понимаю это утверждение. Надеюсь это поможет.
Если вы хотите работать только с одним экземпляром этой формы, вы должны предотвратить Form.Dispose вызвать закрытие пользователя. Для этого вы можете обработать событие закрытия дочерней формы.
private void ChildForm_FormClosing(object sender, FormClosingEventArgs e)
{
this.Hide();
e.Cancel = true;
}
И тогда вам не нужно создавать новые экземпляры frm
. Просто вызовите метод Show в экземпляре.
Вы можете проверить свойство Form.Visible, чтобы проверить, открыта ли форма в данный момент.
private ChildForm form = new ChildForm();
private void ReopenChildForm()
{
if(form.Visible)
{
form.Hide();
}
//Update form information
form.Show();
}
Собственно, я до сих пор не понимаю, почему бы вам просто не обновить данные в форме.
Ответ 5
Form fc = Application.OpenForms["UpdateWindow"];
if (fc != null)
fc.Close();
fc.Show();
Ответ 6
Form1 fc = Application.OpenForms["Form1 "] != null ? (Form1 ) Application.OpenForms["Form1 "] : null;
if (fc != null)
{
fc.Close();
}
Он закроет форму1, вы можете снова открыть эту форму, если хотите, используя:
Form1 frm = New Form1();
frm.show();
Ответ 7
if( ((Form1)Application.OpenForms["Form1"]).Visible == true)
//form is visible
else
//form is invisible
где Form1
- имя вашей формы.
Ответ 8
Попробуйте, это сработает:
//inside main class
Form1 Fm1 = new Form1();<br>
//in button click
if (Fm1.IsDisposed)
{
Fm1 = new Form();
}
Fm1.Show();
Fm1.BringToFront();
Fm1.Activate();
Ответ 9
попробуйте эту функцию MDICHILD
public void mdiChild(Form mdiParent, Form mdiChild)
{
foreach (Form frm in mdiParent.MdiChildren)
{
// check if name equals
if (frm.Name == mdiChild.Name)
{
//close if found
frm.Close();
return;
}
}
mdiChild.MdiParent = mdiParent;
mdiChild.Show();
mdiChild.BringToFront();
}
Ответ 10
Попробуйте подключиться ниже,
private void frmMyForm_Deactivate(object sender, EventArgs e)
{
// Raise your flag here.
}
Проводя над событием выше, он будет сообщать вам всякий раз, когда форма минимизируется, частично/полностью скрывается другой формой.
Ответ 11
Это то, что я использовал для закрытия всех открытых форм (кроме основной формы)
private void CloseOpenForms()
{
// Close all open forms - except for the main form. (This is usually OpenForms[0].
// Closing a form decrmements the OpenForms count
while (Application.OpenForms.Count > 1)
{
Application.OpenForms[Application.OpenForms.Count-1].Close();
}
}
Ответ 12
Смешно, мне пришлось добавить к этой теме.
1) Добавьте глобальный var в form.show() и очистите var на form.close()
2) В родительской форме добавьте таймер. Храните дочернюю форму открытой и обновляйте данные каждые 10 минут.
3) поместите таймер в дочернюю форму, чтобы он сам обновлял данные.
Ответ 13
* Надеюсь, что это сработает для u
System.Windows.Forms.Form f1 = System.Windows.Forms.Application.OpenForms["Order"];
if(((Order)f1)!=null)
{
//open Form
}
else
{
//not open
}
Ответ 14
попробуйте это
bool IsOpen = false;
foreach (Form f in Application.OpenForms)
{
if (f.Text == "Form2")
{
IsOpen = true;
f.Focus();
break;
}
}
if (IsOpen == false)
{
Form2 f2 = new Form2();
f2.MdiParent = this;
f2.Show();
}
Ответ 15
private static Form IsFormAlreadyOpen(Type formType)
{
return Application.OpenForms.Cast<Form>().FirstOrDefault(openForm => openForm.GetType() == formType);
}
Ответ 16
Форма только один раз
Если ваша цель состоит в том, чтобы набрать несколько строк в одной форме, подумайте о следующем...
public class MyForm : Form
{
private static MyForm alreadyOpened = null;
public MyForm()
{
// If the form already exists, and has not been closed
if (alreadyOpened != null && !alreadyOpened.IsDisposed)
{
alreadyOpened.Focus(); // Bring the old one to top
Shown += (s, e) => this.Close(); // and destroy the new one.
return;
}
// Otherwise store this one as reference
alreadyOpened = this;
// Initialization
InitializeComponent();
}
}
Ответ 17
Form user_rpt = Application.OpenForms["frmUesr_reports"];
if (user_rpt == null)
{
/// Do Something here
}
Попробуйте это Это краткая идея, чтобы проверить, что форма открыта или не открыта.
Ответ 18
В моем приложении у меня была форма mainmenu, у которой были кнопки для перехода к ассортименту других форм (также называемых субформ). Я хотел, чтобы за один раз запускался только один экземпляр каждой подформы. Кроме того, я хотел бы убедиться, что пользователь попытался запустить уже существующую подформу, что подформация будет вынуждена показать "фронт и центр", если они сведены к минимуму или за окнами других приложений. Используя самые в настоящее время ответы, я реорганизовал их ответы на это:
private void btnOpenSubForm_Click(object sender, EventArgs e)
{
Form fsf = Application.OpenForms["formSubForm"];
if (fsf != null)
{
fsf.WindowState = FormWindowState.Normal;
fsf.Show();
fsf.TopMost = true;
}
else
{
Form formSubForm = new FormSubForm();
formSubForm.Show();
formSubForm.TopMost = true;
}
}
Ответ 19
if (Application.OpenForms["Form_NAME"] == null)
{
new Form_NAME().Show();
}
Если экземпляр формы не открыт, он войдет в цикл IF.
Ответ 20
Это сработало для меня:
public void DetectOpenedForm()
{
FormCollection AllForms = Application.OpenForms;
Boolean FormOpen = false;
Form OpenedForm = new Form();
foreach (Form form in AllForms)
{
if (form.Name == "YourFormName")
{
OpenedForm = form;
FormOpen = true;
}
}
if (FormOpen == true)
{
OpenedForm.Close();
}
}
Ответ 21
Я считаю, что мой метод простейший.
Form2 form2 = null;
private void SwitchFormShowClose_Click(object sender, EventArgs e)
{
if(form2 == null){
form2 = new Form2();
form2.Show();
}
else{
form2.Close();
form2 = null;
}
}
Ответ 22
Ниже на самом деле работает очень хорошо.
private void networkInformationToolStripMenuItem_Click(object sender, EventArgs e)
{
var _open = false;
FormCollection fc = Application.OpenForms;
foreach (Form frm in fc)
{
if (frm.Name == "FormBrowseNetworkInformation")
{
_open = true;
frm.Select();
break;
}
}
if (_open == false)
{
var formBrowseNetworkInformation = new FormBrowseNetworkInformation();
formBrowseNetworkInformation.Show();
}
}
Ответ 23
это будет слово определенно. Я использую эту функцию и для себя.
public static bool isFormOpen(Form formm)
{
foreach (Form OpenForm in Application.OpenForms)
{
if (OpenForm.Name == formm.Name)
{
return true;
}
}
return false;
}
Ответ 24
Я подправил предыдущий пост, который сделал. Эта работа без нареканий без необходимости повторять все открытые формы.
Form fc = Application.OpenForms["FormBrowse"];
if (fc != null)
{
fc.Select();
}
else
{
var formBrowse = new FormBrowse();
formBrowse.Show();
}
Ответ 25
Кроме того, возможно, это поможет
class Helper
{
public void disableMultiWindow(Form MdiParent, string formName)
{
FormCollection fc = Application.OpenForms;
try
{
foreach (Form form in Application.OpenForms)
{
if (form.Name == formName)
{
form.BringToFront();
return;
}
}
Assembly thisAssembly = Assembly.GetExecutingAssembly();
Type typeToCreate = thisAssembly.GetTypes().Where(t => t.Name == formName).First();
Form myProgram = (Form)Activator.CreateInstance(typeToCreate);
myProgram.MdiParent = MdiParent;
myProgram.Show();
}
catch (Exception ex) { MessageBox.Show(ex.Message); }
}
}