c# - [DefaultValue()] 继承 ComboBox 的问题

标签 c# .net winforms

对于我的一个项目,我继承了一个 ComboBox 来改变它的大小行为。除此之外,我还想加快表单的创建速度,将默认的 DropDownStyle 设置为 ComboBoxStyle.DropDownList

为此,我使用了 [Default()] 命令覆盖了 DropDownStyle 属性

[DefaultValue(ComboBoxStyle.DropDownList)]
public new ComboBoxStyle DropDownStyle
{
    get
    {
        return base.DropDownStyle;
    }
    set
    {
        base.DropDownStyle = value;
    }
}

然后我修改了设计器中的默认值,将 DropDownStyle 设置为 ComboBoxStyle.DropDownList

问题来了... 有少量 InheritedComboBox 我想要 ComboBoxStyle.DropDown 因为他们需要使用

AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.Append;
AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems;

如果我从设计器中设置它,它工作正常,但是,有时,在我重建表单后,它会抛出一个关于 ComboBoxStyle 的异常(也是在设计时)。当我查看 FormName.Designer.cs 文件时,我发现对于特定的 InheritedComboBox 没有

DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDown

而且我必须手动添加它。 这有点无聊,因为有时我只是在运行时注意到它,当程序抛出异常而不显示表单时,我无法在每次重建时测试每个表单...

你知道为什么我会出现这种奇怪的行为吗?

有什么办法可以解决吗?

非常感谢您的回答!

最佳答案

当您设置 AutoCompleteModeAutoCompleteSource 属性时,我相信设计者正在查看基础 ComboBox 而不是生成行来设置 DropDownStyle,因为 DropDown ComboBox 的默认值。

我能够通过向继承的 ComboBox 添加 AutoCompleteModeAutoCompleteSource 属性来更正此问题,但还必须添加一行以设置基础 DropDownStyle 因为设计者设置属性的顺序。

尝试这样的事情,看看它是否适合你:

public class MyComboBox : ComboBox
{
    public MyComboBox()
    {
        DropDownStyle = ComboBoxStyle.DropDownList;
        AutoCompleteMode = AutoCompleteMode.None;
        AutoCompleteSource = AutoCompleteSource.None;
    }

    [DefaultValue(ComboBoxStyle.DropDownList)]
    public new ComboBoxStyle DropDownStyle
    {
        get { return base.DropDownStyle; }
        set { base.DropDownStyle = value; }
    }

    [DefaultValue(AutoCompleteMode.None)]
    public new AutoCompleteMode AutoCompleteMode
    {
        get { return base.AutoCompleteMode; }
        set 
        {
            if (value != AutoCompleteMode.None)
                base.DropDownStyle = ComboBoxStyle.DropDown;

            base.AutoCompleteMode = value; 
        }
    }
    [DefaultValue(AutoCompleteSource.None)]
    public new AutoCompleteSource AutoCompleteSource
    {
        get { return base.AutoCompleteSource; }
        set 
        {
            if (value != AutoCompleteSource.None)
                base.DropDownStyle = ComboBoxStyle.DropDown;

            base.AutoCompleteSource = value; 
        }
    }
}

关于c# - [DefaultValue()] 继承 ComboBox 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3969442/

相关文章:

c# - 如何在使用 RateGate 时更改速率限制?

asp.net - RadioButton 文本样式

c# - 使用 OpenFileDialog 时如何从 *.abcd 文件中过滤 *.abc?

c# - 无法访问基类中的 protected 成员

.net - Azure Page Blob 要求我篡改文件大小

asp.net - 在我的应用程序中托管 ASP.NET

c# - 检测歌曲中的节拍

c# - C# 中的代码生成器

c# - 禁用父面板,同时保持子面板启用

c# - 获取点击的图片框数组索引