我有一个自定义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
的构造函数中的颜色,而不必遍历我以前控制的所有表单并在每个实例中更改它,使我的自定义控件无效。
使用一些提供虚拟吸气剂的属性,这没有问题,但大多数属性都没有。
如何阻止设计人员生成此代码?
答案 0 :(得分:9)
我应该强调,这通常不是你这样做的方式,[DefaultValue]
属性通常是正确的选择。但是您正在使用Color类型的属性,以灵活的方式为其编写属性并不简单。您可以传递给属性构造函数的参数只能是少数几种数据类型,Color不是其中之一。你必须制作一个ColorConverter可以理解的字符串,这既丑陋又难以维护。
PropertyGrid有一种为“困难”属性提供默认值的辅助方法,它还会在类中查找特别命名的私有成员。给定名为“Xxxx”的属性,它会查找以下内容:
这使得此代码有效:
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()方法,因为当用户重置属性时不需要特殊效果,我只是为了完整性而包含它。
答案 1 :(得分:2)
尝试使用InitLayout和DesignMode。您不能在ctor中使用DesignMode,但在构造控件之后,您可以正确访问Designmode属性以设置颜色。注意:仅在运行时才会在设计器中设置样式。
public class MyGridView : DataGridView
{
protected override void InitLayout()
{
base.InitLayout();
if (!DesignMode)
BackgroundColor = Color.Red;
}
}
答案 2 :(得分:2)
有一种更简单的方法可以将DefaultValue指定给Color:
public class MyGridView : DataGridView
{
public MyGridView()
{
BackgroundColor = Color.Red;
}
[DefaultValue(typeof(Color), "Red")]
public new Color BackgroundColor
{
get { return base.BackgroundColor; }
set { base.BackgroundColor = value; }
}
}
答案 3 :(得分:0)
如果需求很简单并且设计外观没有问题,请尝试编写一两个扩展名,例如
public static class Extensions
{
public static void ApplyStyle( this DataGridView dataGridView )
{
dataGridView.RowHeadersVisible = false;
...
}
}