我有一个表单“fm”这是一个简单的信息窗口,每隔10分钟(fm.Show();
)打开一次。
如何打开“fm”形式,如果它打开,如果它打开则将其关闭并再次打开,我每隔10分钟如何制作一次!
现在,表单fm始终使用form fm = new form();
创建
因此,当我尝试检查表单是否打开时,即使之前有一个表单,它也将始终为false并打开一个新窗口!
我需要一个工具给它一个唯一的身份,然后检查这个具有唯一身份的表格是否被打开!
我不想只更新表单上的数据(fm),因为我有一个复杂的按钮信息。
表单名称为"UpdateWindow"
由于
答案 0 :(得分:74)
也许这会有所帮助:
FormCollection fc = Application.OpenForms;
foreach (Form frm in fc)
{
//iterate through
}
foreach中的一些代码可以检测特定的表单,并且可以完成。虽然未经测试。
在http://bytes.com/topic/c-sharp/answers/591308-iterating-all-open-forms
上找到答案 1 :(得分:32)
我知道我迟到了......但对于那些好奇的人......这是另一种方式
if (Application.OpenForms.OfType<UpdateWindow>().Count() == 1)
Application.OpenForms.OfType<UpdateWindow>().First().Close();
UpdateWindow frm = new UpdateWindow()
frm.Show();
答案 2 :(得分:13)
假设我们从菜单中调用表单单击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();
}
}
为检查Form1而定义的 CheckOpened 是否已经打开:
private bool CheckOpened(string name)
{
FormCollection fc = Application.OpenForms;
foreach (Form frm in fc)
{
if (frm.Text == name)
{
return true;
}
}
return false;
}
希望这将解决创建表单的多个实例的问题,如果已经打开或最小化,也可以在菜单单击时将焦点集中到Form1上。
答案 3 :(得分:10)
我不确定我是否理解这一说法。希望这可以帮助。 如果您只想使用此表单的一个实例进行操作,则应阻止用户关闭Form.Dispose。为此,您可以处理子表单的Closing事件。
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();
}
实际上,我仍然不明白你为什么不直接更新表格上的数据。
答案 4 :(得分:2)
Form1 fc = Application.OpenForms["Form1 "] != null ? (Form1 ) Application.OpenForms["Form1 "] : null;
if (fc != null)
{
fc.Close();
}
它将关闭form1,如果你想使用它,你可以再次打开该表单:
Form1 frm = New Form1();
frm.show();
答案 5 :(得分:2)
Form fc = Application.OpenForms["UpdateWindow"];
if (fc != null)
fc.Close();
fc.Show();
答案 6 :(得分:1)
if( ((Form1)Application.OpenForms["Form1"]).Visible == true)
//form is visible
else
//form is invisible
其中Form1
是表单的名称。
答案 7 :(得分:1)
试试这个,它会起作用:
//inside main class
Form1 Fm1 = new Form1();<br>
//in button click
if (Fm1.IsDisposed)
{
Fm1 = new Form();
}
Fm1.Show();
Fm1.BringToFront();
Fm1.Activate();
答案 8 :(得分:1)
尝试 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();
}
答案 9 :(得分:0)
尝试一下,无需遍历表格:
df[complete.cases(df), ]
v1 v2 varA varB
1 1 11 7 1
2 2 12 8 2
3 3 13 9 3
答案 10 :(得分:0)
我已经调整了我之前发表的文章。可以完美地工作,而不必遍历所有打开的表单。
Form fc = Application.OpenForms["FormBrowse"];
if (fc != null)
{
fc.Select();
}
else
{
var formBrowse = new FormBrowse();
formBrowse.Show();
}
答案 11 :(得分:0)
如果您要检查“第二个表单”是否已经打开并避免在buttong单击上再次打开它,则此方法有效。
import matplotlib.pyplot as plt
# Create a date column from index (easier to manipulate)
df["date_column"] = pd.to_datetime(df.index)
# Create a year column
df["year"] = df["date_column"].dt.year
# Create a month-day column
df["month_day"] = (df["date_column"].dt.month).astype(str).str.zfill(2) + \
"-" + df["date_column"].dt.day.astype(str).str.zfill(2)
# Plot. Pivot will create for each year a column and these columns will be used as series.
df.pivot('month_day', 'year', 'Value').plot(kind='line', figsize=(12, 8), marker='o' )
plt.title("Values per Month-Day - Year comparison", y=1.1, fontsize=14)
plt.xlabel("Month-Day", labelpad=12, fontsize=12)
plt.ylabel("Value", labelpad=12, fontsize=12);
答案 12 :(得分:0)
这肯定会说出来。我也为自己使用了此功能。
public static bool isFormOpen(Form formm)
{
foreach (Form OpenForm in Application.OpenForms)
{
if (OpenForm.Name == formm.Name)
{
return true;
}
}
return false;
}
答案 13 :(得分:0)
以下实际上效果很好。
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();
}
}
答案 14 :(得分:0)
我认为我的方法是最简单。
Form2 form2 = null;
private void SwitchFormShowClose_Click(object sender, EventArgs e)
{
if(form2 == null){
form2 = new Form2();
form2.Show();
}
else{
form2.Close();
form2 = null;
}
}
答案 15 :(得分:0)
这对我有用:
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();
}
}
答案 16 :(得分:0)
if (Application.OpenForms["Form_NAME"] == null)
{
new Form_NAME().Show();
}
如果表单实例未打开,它将进入IF循环。
答案 17 :(得分:0)
在我的应用程序中,我有一个mainmenu表单,其中有按钮可以导航到各种其他形式(也就是子表单)。我希望每次只运行一个子表单的一个实例。此外,我想确保用户是否尝试启动已存在的子表单,该子表单将被强制显示&#34; front&amp; center&#34;如果最小化或其他应用程序窗口后面使用当前最受欢迎的答案,我重复了他们的答案:
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;
}
}
答案 18 :(得分:0)
Form user_rpt = Application.OpenForms["frmUesr_reports"];
if (user_rpt == null)
{
/// Do Something here
}
试试这是检查表格是否打开
的简短想法答案 19 :(得分:0)
如果您的目标是拨打表单的多个实例,请考虑遵循......
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();
}
}
答案 20 :(得分:0)
private static Form IsFormAlreadyOpen(Type formType)
{
return Application.OpenForms.Cast<Form>().FirstOrDefault(openForm => openForm.GetType() == formType);
}
答案 21 :(得分:0)
试试这个
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();
}
答案 22 :(得分:0)
*希望这适用于你
System.Windows.Forms.Form f1 = System.Windows.Forms.Application.OpenForms["Order"];
if(((Order)f1)!=null)
{
//open Form
}
else
{
//not open
}
答案 23 :(得分:0)
好笑,我不得不加入这个帖子。
1)在form.show()上添加一个全局var并清除form.close()上的var
2)在父表单上添加一个计时器。保持子表单打开并每10分钟更新一次数据。
3)在子表单上放置计时器以自行更新数据。
答案 24 :(得分:0)
这是我用来关闭所有打开的表单(主表单除外)
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();
}
}
答案 25 :(得分:0)
尝试在下面连线,
private void frmMyForm_Deactivate(object sender, EventArgs e)
{
// Raise your flag here.
}
通过上面的事件接线,只要表格被最小化,部分/完全隐藏在另一个表格中,它就会告诉您。
答案 26 :(得分:-1)
另外,可能会有所帮助
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); }
}
}