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/20836524/

相关文章:

c# - Java 和 C# 的终结器

c# - 从C++调用uv *作为cv::Mat到WPF应用程序BitmapSource?

c# - 如何在数据库中保存一个特定值

c# - Process.start() 启动的进程返回错误的进程 ID?

c# - 使用 Excel Interop C# 过滤掉数据透视表中的(空白)行

c# - 结合 Interlocked.Increment 和 Interlocked.Exchange

c# - 如何在 C# 中将所有 KeyPress 事件作为 UserControl 获取?

c# - 如何在 WebBrowser 控件中注入(inject) Javascript?

c# - winform之间传递变量

c# - 围绕曲线绘制包络