我在WinForm中使用Metro Frame Work组合框,

当我尝试设置cmbCACName.AutoCompleteMode = AutoCompleteMode.Append;时,它会抛出类似“AutoCompleteMode。DropDownStyle为ComboBoxStyle.DropDownList时无法使用”的异常。

这是我的代码

cmbCACName.DropDownStyle = ComboBoxStyle.Simple;
cmbCACName.AutoCompleteMode = AutoCompleteMode.Append;
cmbCACName.AutoCompleteSource = AutoCompleteSource.ListItems;


这是一个例外:
c# - 强制建议将组合框自动完成模式设置为无-C#WinForms-LMLPHP

我不明白发生了什么。

提前致谢

最佳答案

这是例外的原因:


在Metro框架中,已将DropDownStyleMetroComboBox属性重写为始终将DropDownStyle设置为DropDownList
另一方面,在ComboBox中,AutoCompleteMode属性包含一个验证规则,以便在AutoCompleteMode的值设置为None以外的其他值时引发异常。


因此,代码的第一行从技术上讲将DropDownStyle设置为DropDownList。因此,在第二行中,将Append分配给AutoCompleteMode将导致异常。

MetroComboBox.DropDownList

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


ComboBox.AutoCompleteMode

DefaultValue(AutoCompleteMode.None),
SRDescription(SR.ComboBoxAutoCompleteModeDescr),
Browsable(true), EditorBrowsable(EditorBrowsableState.Always)
]
public AutoCompleteMode AutoCompleteMode {
    get {
        return autoCompleteMode;
    }
    set {
        //valid values are 0x0 to 0x3
        if (!ClientUtils.IsEnumValid(value, (int)value, (int)AutoCompleteMode.None, (int)AutoCompleteMode.SuggestAppend)) {
            throw new InvalidEnumArgumentException("value", (int)value, typeof(AutoCompleteMode));
        }
        if (this.DropDownStyle == ComboBoxStyle.DropDownList &&
            this.AutoCompleteSource != AutoCompleteSource.ListItems &&
            value != AutoCompleteMode.None) {
            throw new NotSupportedException(SR.GetString(SR.ComboBoxAutoCompleteModeOnlyNoneAllowed));
        }
        if (Application.OleRequired() != System.Threading.ApartmentState.STA) {
            throw new ThreadStateException(SR.GetString(SR.ThreadMustBeSTA));
        }
        bool resetAutoComplete = false;
        if (autoCompleteMode != AutoCompleteMode.None && value == AutoCompleteMode.None) {
            resetAutoComplete = true;
        }
        autoCompleteMode = value;
        SetAutoComplete(resetAutoComplete, true);
    }
}

10-04 11:12