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

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

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


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

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

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


如果我从Designer设置它,则可以正常工作,但是,有时候,在我重建表单之后,它会抛出一个有关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;
        }
    }
}

07-27 13:24