5

我在带有框架 4.0 的 Visual Studio 2010 中使用 C#。

在我的项目中,以两种不同的形式,有两个FileSystemWatchers 的属性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)我发现:

  • 在设计器中,在 的属性中fileSystemWatcher1EnableRaisingEvents被设置回true

  • 在代码中,之前添加的行丢失了

我尝试迁移到 Visual Studio 2012(仍然是框架 4.0),解决方法又解决了几天的问题。然后我得到了与VS10相同的情况。

还有什么想法吗?

4

3 回答 3

2

它也发生在 Visual Studio 2012 中,您不必关闭 Visual Studio。重新打开表单设计器足以True在设计器中和运行时将属性设置为 。

这似乎是FileSystemWatcher.

一种解决方法是将此行添加到您的InitializeComponent明确:

this.fileSystemWatcher1.EnableRaisingEvents = false;

如果设计师不您合作,您将不得不反对它。您输入的任何内容都InitializeComponent可能被设计师覆盖或删除,InitializeComponent设计师的领域也是如此。处理此问题的一种方法是在表单的构造函数中的调用之后立即添加该行。InitializeComponent

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

这意味着设计师不会向您显示 的正确值EnableRaisingEvents,但由于它无论如何都不能很好地工作,这可能不是一个大问题。将线放入构造函数中可确保设计者在将来的任何时候都不会将其删除。

于 2013-03-16T13:25:09.883 回答
1

现在我不希望这个答案被接受,但无论如何。我编写了一个小预处理程序,它读取和修改 Visual Studio 项目中的 C# 源文件,并做了一些有趣的事情,比如提供一些本地化服务和在我的日志记录语句中插入唯一的日志标记。这个预处理程序由我所有 .csproj 文件中的 BeforeBuild 目标调用,因此它作为每次编译的一部分运行。

我目前没有摆弄 .Designer.cs 文件,但我正在修改 .resx 文件,并且它们具有相同的不幸特征,即在 Visual Studio 设计器的主持下,因此每当我更改表单时,我的修改都会被丢弃,但后来我的预处理器程序只是重新修改了 .resx 文件。每当 Visual Studio 设计器丢弃它时,重新插入该语句以将 EnableRaisingEvents 设置为 false 的过程相同。

这将使用大锤将图钉放置到位,但它会起作用。

编辑:

对于任何考虑将其作为解决此问题或类似问题的技术的人,此线程包含有关如何使 Visual Studio 与预处理器共存的一些技巧:如何让 Visual Studio 在 BeforeBuild 处理后重新读取源文件?

于 2013-03-16T01:47:20.420 回答
1

我使用 Virtlink 建议在代码中添加所需的行,例如:

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

以下是我可以找到的更多理由来辩护为什么你不应该(永远)编辑你的 Designer.cs

您可以从 Herenvardo 评论中找到更多信息。这是一个简短的..

编辑 .Designer.cs(或 Visual Basic 中的 .Designer.vb)文件是不可取的,无论您为什么要编辑它;而且几乎从不需要它。不建议编辑这些文件有两个主要原因:

  1. IDE 使用非常严格的编码约定来编写这些文件,并希望它们遵循这些约定(空格和制表符之类的东西不会引起问题,但是任何改变文件结构或代码分析树的东西很可能有讨厌的副作用)。
  2. IDE 可能会在许多情况下覆盖您的更改,甚至不会告诉您。通常,对于窗体或用户控件的 .designer 文件,只要您从设计器进行更改,该文件就会被覆盖。对于设置文件(我对这些没有太多实践),我猜当您从 IDE 本身(从项目属性的设置页面)编辑设置时,它们会被重写。确保安全的最简单方法是假设 IDE 可能出于任何原因随时更改任何 .designer 文件。尽管 IDE 何时写入每个文件已明确定义,但可能很难知道和记住何时以及为什么可以重新制作每个文件,所以安全总比后悔好。
于 2013-03-18T03:24:44.243 回答