我有一个自定义的 DataGridView
,让我们这样说:
public MyGridView : DataGridView
{
public MyGridView()
{
BackgroundColor = Color.Red;
}
}
现在,当我在使用设计器的项目中使用此控件时,出于某种原因,我觉得还需要在 designer.cs 文件中设置该属性。
所以在设计器文件中,我会:
this.MyGridView1.BackgroundColor = System.Drawing.Color.FromArgb((byte)(int)255, (byte)(int)0, (byte)(int)0);
我的问题是,它阻止我在 MyGridView
的构造函数中更改颜色,而不必遍历我用来控制和更改的所有表单每个实例,使我的自定义控件无用。
对于一些提供虚拟 getter 的属性,这没有问题,但大多数属性都没有。
如何防止设计人员生成此代码?
最佳答案
我应该强调,这通常不是您执行此操作的方式,[DefaultValue]
属性通常是正确的选择。但是您正在使用 Color 类型的属性,以灵活的方式为其编写属性并不简单。您可以传递给属性构造函数的参数只能是选定的几种数据类型,Color 不是其中之一。您必须制作 ColorConverter 可以理解的字符串,这既丑陋又难以维护。
PropertyGrid 有一种为“困难”属性提供默认值的辅助方法,它还会在类中寻找特别命名的私有(private)成员。给定一个名为“Xxxx”的属性,它会查找以下内容:
- DefaultXxxx,一个只有一个返回默认值的 getter 的属性
- ResetXxxx(),当用户选择重置上下文菜单项时可以运行的方法
- ShouldSerializeXxxx(),如果不应保留属性值,该方法应返回 false。
使这段代码工作的原因:
public class MyGridView : DataGridView {
public MyGridView() {
this.BackgroundColor = DefaultBackgroundColor;
}
public new Color BackgroundColor {
get { return base.BackgroundColor; }
set { base.BackgroundColor = value; }
}
private bool ShouldSerializeBackgroundColor() {
return !this.BackgroundColor.Equals(DefaultBackgroundColor);
}
private void ResetBackgroundColor() {
this.BackgroundColor = DefaultBackgroundColor;
}
private static Color DefaultBackgroundColor {
get { return Color.Red; }
}
}
请注意,ResetBackgroundColor() 方法实际上并不是必需的,因为当用户重置属性时不需要特殊效果,我只是为了完整性而包含它。
关于c# - 防止 Winforms Designer 为继承的控件生成属性值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20836524/