簡體   English   中英

C#在多表單應用程序中關閉特定表單

[英]C# Closing a specific form in a multiform application

我希望你能幫我這個。 我的應用程序正在監視數據庫中的警報。 當數據庫中出現警報時,我的應用程序會將其添加到datagridview中的主窗體中,並且根據其優先級,它還將使用該事件創建一個小的winform彈出窗口。

在datagridview中有一個按鈕,用於將警報標記為“已見”,然后它將更新數據庫,並且它將從列表中消失。 但是,此活動的彈出窗體仍然是打開的。

有誰知道如何關閉此表格? 我需要一種方法來查找可能的多個警報表單之間的特定表單。

我到目前為止最接近的是以下代碼:

private void closeForm(int id)
{
    foreach (Form f in Application.OpenForms)
    {
        if (Convert.ToString(id) == f.Name)
        {
            this.Close();
        }
    }
}

直到它關閉正確的形式為止。 然后它給出一個錯誤,說“收集已被修改;枚舉操作可能無法執行”。 這有點意義,但我根本無法找到另一種方法。

我有一個名為Alert的winform類,它創建了新的表單。 如您所見,他們將獲得標准文本“警報”和基於警報ID的唯一名稱。

Alert alertform = new Alert(id);
alertform.Name = formid;
alertform.Text = "Alarm";
alertform.Show();

我希望有人有一些好主意我怎么能這樣做。 我已經搜索過,但無法真正找到一種簡單而優雅的方法來做到這一點。

您應該只需要在DataGridView或其DataSource存儲對表單的引用,然后使用該引用關閉表單。 與迭代所有應用程序表單相比,此方法在將來不太可能中斷。

可能最有效的方法是向DataGridView添加一個隱藏列,其中包含表單id,然后還有一個Dictionary<int, Form> ,用於獲取對要關閉的Form的引用。

然后你可以簡單地從字典中獲取表單引用並在其上調用close:

private void CloseAlertForm(int id)
{        
    Form f = dict[id];
    f.Close();
    dict.Remove(id);
}

此外,您可以存儲Action代理而不是表單引用,從而允許您稍微分離警報表單和網格表單。

你需要添加休息; 關閉表單后進入循環。 當您關閉表單(該表單從集合中刪除)時,將修改該集合,從而使foreach循環無效。 如果你不打電話給f.Close,而不是這個。關閉?

private void closeForm(int id)

    {
        foreach (Form f in Application.OpenForms)

            if (Convert.ToString(id) == f.Name)
            {
                f.Close();
                break;

            }
    }

得到參考。 來自foreach循環並關閉它外面的form

private void closeForm(int id)
{   
        Form formtoclose=null;
        foreach (Form f in Application.OpenForms)
        {
            if (Convert.ToString(id) == f.Name)
            {
                formtoclose = f;
            }
        }
        if(formtoclose!=null)
        formtoclose.Close();
}

Close會修改您的OpenForms集合,因此您可以直接枚舉OpenForms集合而不是枚舉。

LINQ非常方便制作副本,如下所示:

foreach (Form f in Application.OpenForms.Where(i => Convert.ToString(id) == i.Name).ToList()) {
      // Save to close the form here
}

ToList執行查詢,並存儲副本。

您可以使用表單的類型來查找它們(並且ToArray可以創建新的集合,避免更改您要枚舉的集合)。

private void CloseAlerts()
{
    var openForms = Application.OpenForms.Cast<Form>();
    foreach (var f in openForms.Where(f => f is Alert).ToArray())
    {
        f.Close();
    }
}

在這種情況下,您不需要設置名稱:

Alert alertform = new Alert(id);

alertform.Text = "Alarm";

alertform.Show();
var names = Application.OpenForms.Select(rs=>rs.name).ToList()

foreach (string name in names)
    if (Convert.ToString(id) == name)
    {
        Application.OpenForms[name].Close();
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM