[英]c# Limit amount of messageboxes
您好,我又遇到了自己無法解決的問題。
我有一個名為filOvervakare
的FileSystemWatcher
並使用此代碼來觸發方法。
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.