[DefaultValue()]继承ComboBox的问题

时间:2010-10-19 14:32:54

标签: c# .net winforms

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

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

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

然后我在Designer中将默认值设置为DropDownStyleComboBoxStyle.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

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

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

有没有办法解决它?

非常感谢您的回答!

2 个答案:

答案 0 :(得分:1)

当您设置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; 
        }
    }
}

答案 1 :(得分:0)

尝试将此值设置为继承的组合框的构造函数中的属性,以及使用DefaultValue设置的值。这应该可以解决您的问题。