C# 如何知道某个表单是否已打开?

C# 如何知道某个表单是否已打开?,c#,winforms,linq,C#,Winforms,Linq,我有一个执行以下操作的应用程序: 一个组件在数据库中查找更改 对于每个更改,都会向存储更改警报信息的表中添加一行 另一个组件查找警报 对于每个警报,都会弹出一个警报窗体 以前,我的代码一次只显示一个警报,一切正常。现在,我正在更改代码,以允许同时打开多个警报表单 while(true) { DB = //pseudocode: database object Var ResultAlert = from a in DB.Alerts where

我有一个执行以下操作的应用程序:

一个组件在数据库中查找更改
对于每个更改,都会向存储更改警报信息的表中添加一行

另一个组件查找警报
对于每个警报,都会弹出一个警报窗体

以前,我的代码一次只显示一个警报,一切正常。现在,我正在更改代码,以允许同时打开多个警报表单

while(true)
{
    DB = //pseudocode: database object
    Var ResultAlert = 
        from a in DB.Alerts
        where a.Status == 0;

    foreach(var RowAlert in ResultAlert)
    {
        AlertForm f = new AlertForm(RowAlert.Id);
        f.Show();
    }
    Thread.Sleep(1000);
}

如您所见,这段代码将每秒检查新警报,这一切都很好,但它可能每秒打开重复警报表单。我想知道的是如何检测哪些表单处于打开状态(使用相应的AlertID),以便我只能打开新的警报窗口

您需要跟踪为每个警报打开的表单。假设您的警报表有一个整数主键(例如AlertId),您可以在字典中跟踪它们:

var openForms = new Dictionary<int, AlertForm>();
while(true)
{
    DB = //pseudocode: database object
    Var ResultAlert = 
        from a in DB.Alerts
        where a.Status = 0;

    foreach(var RowAlert in ResultAlert)
    {   
        var alertId = RowAlert.AlertId;
        if(!openForms.ContainsKey(alertId))
        {
            AlertForm f = new AlertForm();
            openForms.Add(alertId, f);
            f.Show();
         }
    }
    Thread.Sleep(1000);
}
var openForms=newdictionary();
while(true)
{
DB=//伪代码:数据库对象
Var ResultAlert=
从DB.Alerts中的
其中a.状态=0;
foreach(ResultAlert中的变量RowAlert)
{   
var alertId=rowarert.alertId;
如果(!openForms.ContainsKey(alertId))
{
AlertForm f=新的AlertForm();
添加(alertId,f);
f、 Show();
}
}
睡眠(1000);
}

如果您不需要对打开的表单执行任何操作,那么您可以将ID存储在
哈希集中

很高兴今天看到您的另一个响应。非常有帮助!我实现了你在这里的东西,它工作得很好:D