应用程序完成后,为什么运行时值出现在设计模式中?
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。
我有 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。