5

我在Visual Studio 2010中使用框架4.0中的C#。每次打開Visual Studio時,FileSystemWatcher EnableRaisingEvent都會更改

在我的項目中,有兩種不同的形式,有兩個FileSystemWatcher s,屬性EnableRaisingEvent設置爲false。如果我關閉Visual Studio,當我重新打開它時,我同時獲得FileSystemWatcher屬性EnableRaisingEvent設置爲true

在我在設計文件中這兩種形式有以下代碼:

private void InitializeComponent() 
{ 
    this.components = new System.ComponentModel.Container(); 
    System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1)); 
    this.fileSystemWatcher1 = new System.IO.FileSystemWatcher(); 
    ((System.ComponentModel.ISupportInitialize)(this.fileSystemWatcher1)).BeginInit(); 
    this.SuspendLayout(); 

    this.fileSystemWatcher1.Filter = "my_filter"; 
    this.fileSystemWatcher1.NotifyFilter = System.IO.NotifyFilters.LastWrite; 
    this.fileSystemWatcher1.SynchronizingObject = this; 
    this.fileSystemWatcher1.Changed += new System.IO.FileSystemEventHandler(this.fileSystemWatcher1_Changed); 
} 

酒店EnableRaisingEvent沒有設置,但默認是false

任何想法,爲什麼我得到這種奇怪的行爲?

編輯

我跟着Virtlink的建議,將下面的代碼行:

this.fileSystemWatcher1.EnableRaisingEvents = false; 

這似乎解決我的問題,但幾天後(有的開,關,重建項目,但沒有改變fileSystemWatcher1),我發現:

  • 在設計師在fileSystemWatcher1的屬性,EnableRaisingEvents被設置回true

  • 中的代碼,之前添加的一行丟失

我試圖移動到Visual Studio 2012(靜止框架4.0)和解決方法解決了更多天的問題。然後我得到了和VS10一樣的情況。

還有其他想法嗎?

+0

您能否確認,您添加了Virtlink的建議'this.fileSystemWatcher1.EnableRaisingEvents = false;'在Form.cs文件的構造函數中? – 2013-03-18 03:32:29

+0

@jacobaloysious我做了,似乎解決了這個問題!謝謝 – 888 2013-03-22 10:02:04

回答

2

它也發生在Visual Studio 2012中,您不必關閉Visual Studio。重新打開表單設計人員足以讓設置在運行時在視覺上將該屬性設置爲True

這似乎是FileSystemWatcher中的一個錯誤。

一種解決方法是這一行添加到您的InitializeComponent明確:

this.fileSystemWatcher1.EnableRaisingEvents = false; 

如果設計師不能與工作你,你必須要繼續反對它。您在InitializeComponent中放置的任何東西都可能被設計師覆蓋或刪除,因爲InitializeComponent是設計師的領地。解決這個問題的方法之一是在之後在表單的構造函數中添加之後的InitializeComponent

InitializeComponent(); 
this.fileSystemWatcher1.EnableRaisingEvents = false; 

這意味着設計人員表明您EnableRaisingEvents正確的值,但由於它沒有工作那麼好反正可能並不是一個大問題。將該行放入構造函數中可確保設計人員在將來的任何時候都不會刪除該行。

+0

謝謝您的建議。現在它似乎解決了! – 888 2013-03-20 10:59:14

1

現在我不認爲這個答案被接受,但是無論如何,我已經編寫了一個預處理器程序,用於讀取和修改Visual Studio項目中的C#源文件,並執行一些有趣的事情,例如提供一些本地化服務並在日誌記錄語句中插入獨特的日誌標記。這個預處理器程序由我所有的.csproj文件中的BeforeBuild目標調用,因此它作爲每個編譯的一部分運行。

我目前沒有處理.Designer.cs文件,但我正在修改.resx文件,並且它們具有在Visual Studio設計器的支持下的相同不幸特性,所以我的修改會在我無法使用時丟棄更改表單,但是然後我的預處理器程序只是重新修改.resx文件。重新插入該語句以便在Visual Studio設計器丟棄它時將EnableRaisingEvents設置爲false的過程相同。

這將使用大錘放圖釘,但它會工作。

編輯:

對於任何人誰不考慮實施此作爲解決這種或類似的問題的技術,這個線程包含有關如何做一些提示的Visual Studio並存的預處理器:How to get Visual Studio to reread source files after BeforeBuild processing?

1

我Virtlink建議繼續添加所需的行中的代碼,例如:

public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
      this.fileSystemWatcher1.EnableRaisingEvents = false; 
     } 
    }  

下面是一些原因,我能找到捍衛爲什麼你不應該(NEVER)編輯 設計師.cs

你可以從Herenvardo的評論Here找到更多的信息。下面是它的一個簡要介紹。

不管爲什麼要編輯它,編輯.Designer.cs(或.Designer.vb在Visual Basic中)文件都是不可取的。而且幾乎不需要。爲什麼有編輯這些文件主要有兩個原因是如此不明智的:

  1. 的IDE寫這些文件具有非常剛性的編碼習慣,並希望他們遵循這樣的慣例(東西像間距和跳格不會引發問題,但任何改變文件結構或代碼的分析樹的結構都很可能會有令人討厭的副作用)。
  2. 在許多情況下,IDE可能會覆蓋您的更改,而不是 甚至會告訴您。通常,對於表單或用戶控件的 .designer文件,只要您從設計人員更改 ,就會覆蓋該文件。對於設置文件(我沒有太多練習 與這些),我想他們在IDE中編輯設置 (從項目屬性的設置頁面)被重寫。 安全的最簡單方法是假定IDE可能隨時因任何原因更改任何 .designer文件。儘管它很好地定義了當IDE將寫入每個文件時,可能很難知道並記住每個文件何時以及爲什麼可以被重新制作,因此安全性比對不起更好。
+0

雖然不推薦,但如果保留文件的結構,則可以編輯設計器文件。例如,刪除一個事件處理程序是很常見的,並且不太常見,但是如果設計者設置了它,可能會添加一個值_as。兩者通常都可以通過設計師本身來實現,所以不需要編輯。 – Virtlink 2013-03-18 08:53:36

相關問題