簡體   English   中英

c#的消息框數量限制

[英]c# Limit amount of messageboxes

您好,我又遇到了自己無法解決的問題。

我有一個名為filOvervakareFileSystemWatcher並使用此代碼來觸發方法。

filOvervakare.NotifyFilter = NotifyFilters.Size;
filOvervakare.NotifyFilter = NotifyFilters.LastWrite;

filOvervakare.Changed += new FileSystemEventHandler(filOvervakare_Changed);

這是方法:

void filOvervakare_Changed(object sender, FileSystemEventArgs e)
{
    if (MessageBox.Show("Vill du ladda upp filen " + e.Name + "?", "En fil har ändrats", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
    {
        //code code code           
    }
}

每次更改文件時,都應該顯示一次消息框。 問題是,它沒有像出現5-6個消息框那樣彈出一個消息框,而且我不知道如何解決此問題,我希望你們中的一些人可能有一個好的解決方案。 :)

謝謝!

// 摩根

這是設計使然,事件處理程序在每個通知的不同線程上調用。 一個快速修復是設置FileSystemWatcher.SynchronizingObject屬性:

    public Form1() {
        InitializeComponent();
        fileSystemWatcher1.SynchronizingObject = this;
    }

但這不是一個好主意,FSW可能會丟失通知,因為它已被阻止,等待您單擊“確定”按鈕。 在通知事件中顯示消息框並不是一個好主意,您希望盡快處理通知。

您可以使用布爾值來告訴您是否打開了消息框。

private bool messageBoxIsOpen;

void filOvervakare_Changed(object sender, FileSystemEventArgs e)
{
    if (this.messageBoxIsOpen)
    {
        return;
    }

    this.messageBoxIsOpen = true;
    if (MessageBox.Show(
        "Vill du ladda upp filen " + e.Name + "?", 
        "En fil har ändrats", 
        MessageBoxButtons.YesNo, 
        MessageBoxIcon.Question) == DialogResult.Yes)
    {
       //code code code           
    }

    this.messageBoxIsOpen = false;
}

有一些事件,例如LastAccess,LastWrite等,文件系統監視程序將在這些事件上觸發事件。 您可以在顯示消息框之前檢查事件args,以了解引發該事件的原因,或者設置NotifyFilter屬性。

您可以將上次更改的文件名保存在虛擬變量中,並且在引發更改事件時,除非文件名與保存的變量不同,否則不要顯示消息框。

string lastChangedFileName = "";
void filOvervakare_Changed(object sender, FileSystemEventArgs e)
    {

if(lastChangedFileName != e.Name)
{
        if (MessageBox.Show("Vill du ladda upp filen " + e.Name + "?", "En fil har ändrats", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
        {
           //code code code           
        }
}
lastChangedFileName = e.Name;

    }

解決此問題的最簡單方法是聲明一個私有布爾值,如下所示:

private bool m_IsBoxShown;

在構造函數中,將值設置為false。 將上面的代碼更改為如下所示:void filOvervakare_Changed(object sender,FileSystemEventArgs e)
{
如果(m_IsBoxShown ==假){m_IsBoxShown = true; 如果(MessageBox.Show(“ Vill du ladda upp filen” + e.Name +“?”,“ En fil harändrats”,MessageBoxButtons.YesNo,MessageBoxIcon.Question)== DialogResult.Yes)
{
m_IsBoxShown = false; //代碼代碼
} else {m_IsBoxShown = false; }}}

我建議在顯示MessageBox之前有一個短的延遲,例如10-100ms。 這樣,當文件快速更改幾次后,您只會得到一個MessageBox。

換句話說,收到通知時,請啟動計時器。 如果計時器已經啟動,請忽略該通知。 當計時器觸發時,停止計時器並顯示MessageBox。

暫無
暫無

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

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