c#限制消息框的数量

时间:2010-03-01 22:33:22

标签: c# messagebox filesystemwatcher

您好我已经遇到了一个问题,我无法自行解决。

我有FileSystemWatcher名为filOvervakare并使用此代码触发方法。

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那样弹出,我不知道如何解决这个问题,我希望你们中的一些人可能有一个很好的解决方案。 :)

谢谢!

//摩根

6 个答案:

答案 0 :(得分:2)

这是设计使然,在每个通知的不同线程上调用事件处理程序。快速解决方法是设置FileSystemWatcher.SynchronizingObject属性:

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

但这不是一个好主意,FSW可能会因为被阻止而错过通知,等待您点击“确定”按钮。在通知事件中显示消息框并不是一个好主意,您希望尽快处理通知。

答案 1 :(得分:1)

您可以使用布尔值来告诉您是否打开了消息框。

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;
}

答案 2 :(得分:1)

有一些事件,比如LastAccess,LastWrite等,文件系统观察者会触发事件。在显示消息框或设置NotifyFilter属性之前,您可以检查事件args以了解事件被触发的原因。

答案 3 :(得分:1)

您可以将最后更改的文件名保存在虚拟变量中,并且当引发更改的事件时,除非文件名与保存的变量不同,否则不要显示消息框。

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;

    }

答案 4 :(得分:0)

解决此问题的最简单方法是声明私有bool,如下所示:

private bool m_IsBoxShown;

在构造函数中,将值设置为false。将上面的代码更改为如下所示:     void filOvervakare_Changed(object sender,FileSystemEventArgs e)
    {
        if(m_IsBoxShown == false)         {             m_IsBoxShown = TRUE;             if(MessageBox.Show(“Vill du ladda upp filen”+ e.Name +“?”,“En filharändrats”,MessageBoxButtons.YesNo,MessageBoxIcon.Question)== DialogResult.Yes)

            {
               m_IsBoxShown = FALSE;                //代码代码
            } else {m_IsBoxShown = false; }         }     }

答案 5 :(得分:0)

我建议的是在显示MessageBox之前有一个短暂的延迟,比如10-100ms。这样,当文件快速更改几次时,您只能获得一个MessageBox。

换句话说,当收到通知时,启动计时器。如果计时器已启动,请忽略该通知。当计时器触发时,停止计时器并显示MessageBox。