prevent的WinForms从生成的属性值设计为继承控件控件、属性、prevent、WinForms

2023-09-04 02:48:19 作者:因帅被判无妻i

我有一个自定义的的DataGridView ,让我们说这样:

I have a custom DataGridView, let's say as such:

public MyGridView : DataGridView
{
    public MyGridView()
    {
         BackgroundColor = Color.Red;
    }
}

现在,使用设计,当我使用这种控制在一个项目中,由于某种原因感到有必要也设置在designer.cs文件中的属性。

Now, when I use this control in a project using the designer, for some reason it feels a need to also set the property in the designer.cs file.

所以,在设计文件中,我将有:

So in the designer file, I would have:

this.MyGridView1.BackgroundColor = System.Drawing.Color.FromArgb((byte)(int)255, (byte)(int)0, (byte)(int)0);

这个问题我是它$ P $从能够改变颜色的构造pvents我,我的 MyGridView ,而不必通过所有的形式,我用于控制和每个实例改变它,使我的自定义控件没用。

The problem me with this is that it prevents me from being able to change the color in the constructor of my MyGridView, without having to go through all the forms in which I used to control and change it per instance, rendering my custom control useless.

通过一些属性它提供一个虚拟的吸气剂,这是没有问题的,但大多数属性没有了。

With some properties which offer a virtual getter, this is no problem, but most properties do not have it.

我怎样才能prevent从产生这个code的设计师?

How can I prevent the designer from generating this code?

推荐答案

我要强调,这不是通常这样做的方式, [默认值] 属性通常是正确的选择。但是,你正在使用Color类型的属性,它不是简单的写的属性以灵活的方式。你可以传递到属性构造函数的参数可以是只有一小部分的数据类型,颜色是不是其中之一。你必须制作一个的字符串的是ColorConverter能理解,这既难看又难维护。

I should emphasize that this isn't normally the way you do this, the [DefaultValue] attribute is normally the correct choice. But you are working with a property of type Color, it is not simple to write the attribute for that in a flexible way. The arguments you can pass to an attribute constructor can be only a select few data types, Color isn't one of them. You'd have to craft a string that ColorConverter can understand, that's both ugly and hard to maintain.

PropertyGrid中具有提供默认值困难的属性的辅助方式,它也将寻找在类特别命名的私有成员。给定一个名为XXXX的属性,它会寻找以下内容:

PropertyGrid has a secondary way of providing defaults for "difficult" properties, it will also look for specially named private members in the class. Given a property named "Xxxx", it looks for the following:

DefaultXxxx,只有一个getter一个属性,它返回的默认值 ResetXxxx(),当用户选择重置上下文菜单项,可以运行的方法 ShouldSerializeXxxx()方法应该返回的假的如果财产的价值不应该被保留。 DefaultXxxx, a property with just a getter that returns the default value ResetXxxx(), a method that can run when the user selects the Reset context menu item ShouldSerializeXxxx(), a method that should return false if the value of the property should not be persisted.

这使得这个code的工作:

Which makes this code work:

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()方法实际上不是必要的,我只是把它列入的完整性。

Note that the ResetBackgroundColor() method is not actually necessary since no special effects are required when the user resets the property, I just included it for completeness.