代码之家  ›  专栏  ›  技术社区  ›  il_guru 0xAX

继承组合框时[DefaultValue()]出现问题

  •  2
  • il_guru 0xAX  · 技术社区  · 14 年前

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

    为了做到这一点,我用了 [Default()] 命令覆盖 下拉式 财产

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

    然后我修改了设计器中的默认值设置 下拉式 ComboBox样式.DropDownList .

    问题来了… 有一小部分我想继承的ComboBox ComboBoxStyle.DropDown 因为他们需要合作

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

    如果我从设计器中设置它,它会很好地工作,但是,有时在我重新构建表单之后,它会抛出一个关于ComboBoxStyle的异常(在设计时也是如此)。当我查看formname.designer.cs文件时,可以发现对于特定的继承ComboBox,没有

    DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDown

    我必须手动添加。 这有点无聊,因为有时我只是在运行时注意到,当程序抛出一个异常而不显示窗体时,我不能每次重新生成时测试每个窗体…

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

    有什么办法可以解决吗?

    谢谢你的回答!

    2 回复  |  直到 14 年前
        1
  •  1
  •   Jeff Ogata    14 年前

    当你设置 AutoCompleteMode AutoCompleteSource 属性,我认为设计器正在查找基组合框,而不是生成用于设置 DropDownStyle ,因为 DropDown 组合框的默认值。

    我可以通过添加 自动完成模式 自动完成源 属性设置为继承的组合框,但还必须添加一行以设置基 下拉式 因为设计器设置属性的顺序。

    尝试类似的方法,看看它是否适用于您:

    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; 
            }
        }
    }
    
        2
  •  0
  •   Pieter van Ginkel    14 年前

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