应用程序完成后,为什么运行时值出现在设计模式中?

After application has finished, why runtime values appear in design mode?

我有 DataGridViewComboBoxColumn 的自定义后代,在设计模式中设置了以下值 Items 属性:

    ItemA
    ItemB
    ItemC

在运行时,我将 Items 属性 更改为这样(示例):

for (int i = 0; i < Items.Count; i++) {
    Items(i) = Convert.ToString(Items(i)) + " CHANGED";
}

关闭表单并 return 进入设计模式后,我可以看到 属性 值设置为

    ItemA CHANGED
    ItemB CHANGED
    ItemC CHANGED

我不相信这是可能的,但这就是我得到的。 5 次启动后,我可以看到每个项目都带有 CHANGED CHANGED CHANGED CHANGED CHANGED.

后缀

我只更改了一次项目,在从 DataGridViewComboBoxCell 的后代的 Paint 事件处理程序调用的方法中。 (没有更好的地方挂钩它,因为在构造函数中,初始化还没有完成所以Items.Count = 0)。

很可能您创建了一个新组件并在设计器中使用了它。

当您设计组件本身或表单时,该组件或表单中的代码不会执行。事件处理程序、方法覆盖、none 的执行。

但是,如果您在设计器中使用组件,例如在表单中,那么该组件中的代码将执行。

很可能您在 Visual Studio 内的设计器中运行的组件中有代码。事实上,启动该应用程序似乎会留下其更改的残余,这可能更像是巧合。

例如,实现此目的的典型方法是重写组件中的 paint 方法,而不检查组件是否处于设计模式。每当组件需要绘制时,这包括它位于不同窗体或控件的设计器中,那么该代码就会执行。

要检查组件是否处于设计模式,您应该这样做:

bool designMode = (LicenseManager.UsageMode == LicenseUsageMode.Designtime);

另见 this question for more details: Detecting design mode from a Control's constructor