c# - 防止 Winforms Designer 为继承的控件生成属性值

标签 c# .net winforms visual-studio-2010 windows-forms-designer

我有一个自定义的 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/39187685/

相关文章:

.net - 将匿名类型作为参数传递给函数

c# - 方法中的多个 Linq.Tables

c# - 当消费者不堪重负时,如何让快速生产者暂停?

c# - 无法读取配置部分 'configsections',因为它缺少部分声明

c# - 我要处理我的 ODBCConnection

c# - 如何在 C# 中找出并防止死锁

c# - 如何从 DataGridViewComboBoxColumn 获取选定值?

c# - RichTextBox无法插入图片

c# - 如何在没有任何身份验证的情况下调用 WCF 服务?

c# - Entity Framework 6 - 使用 ToString 加入时出现 ORA-00932