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

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

    ItemA
    ItemB
    ItemC

在运行时,我正在更改此Items属性,如下所示(示例):

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

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

    ItemA CHANGED
    ItemB CHANGED
    ItemC CHANGED

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

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

最佳答案 您很可能已经创建了一个新组件并在设计器中使用它.

在设计组件本身或表单时,该组件或表单中的代码不会执行.事件处理程序,方法覆盖,没有执行.

但是,如果在设计器中使用组件(如表单中),则该组件中的代码将执行.

很可能您在Visual Studio中的设计器中运行的组件中有代码.事实上似乎启动应用程序留下了其变化的残余可能更巧合.

例如,实现此目的的典型方法是覆盖组件中的paint方法,而不检查组件是否处于设计模式.每当需要绘制组件时,这包括它在不同形式或控件的设计器中,那么该代码将被执行.

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

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

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

点赞