只读Windows窗体组合框

时间:2010-10-03 09:25:14

标签: .net winforms combobox

有没有办法让Windows窗体组合框只读? 具体来说:用户应该能够键入,但只允许使用框中的那些值(使用自动完成或从列表中选择)。

或者是使用验证事件的唯一方法吗?

问候

马里奥

3 个答案:

答案 0 :(得分:3)

您可以将DropDownStyle设置为DropDownList,但这实际上不允许键入(但它允许使用键盘进行选择)。

如果您确实希望用户能够键入/查看不完整的单词,则必须使用事件。验证事件将是最佳选择。

答案 1 :(得分:3)

如果您在用户输入内容时设置AutoCompleteMode = SuggestAppendAutoCompleteSource = ListItems,则组合框会自动显示以键入的字符开头的条目。

然后,通过处理SelectedIndexChangedSelectedValueChanged事件,您可以在用户输入值列表中存在的值时拦截。

如果您也绝对不希望用户键入列表中没有的任何内容,那么您必须处理例如KeyDown事件,例如:

private void comboBox1_KeyDown(object sender, KeyEventArgs e)
{
    char ch = (char)e.KeyValue;
    if (!char.IsControl(ch))
    {
        string newTxt = this.comboBox1.Text + ch;
        bool found = false;
        foreach (var item in this.comboBox1.Items)
        {
            string itemString = item.ToString();
            if (itemString.StartsWith(newTxt, StringComparison.CurrentCultureIgnoreCase))
            {
                found = true;
                break;
            }
        }
        if (!found)
            e.SuppressKeyPress = true;
    }
}

答案 2 :(得分:0)

感谢。除KeyDown事件代码外,上述方法适用于我。因为组合框附加到DataTable。如果组合框附加到DataTable,请尝试以下代码。如果您也绝对不希望用户键入列表中不存在的任何内容。

private void cmbCountry_KeyDown(object sender, KeyEventArgs e)
    {
        char ch = (char)e.KeyValue;
        if (!char.IsControl(ch))
        {
            string newTxt = this.cmbCountry.Text + ch;
            bool found = false;
            foreach (var item in cmbCountry.Items)
            {
                DataRowView row = item as DataRowView;
                if (row != null)
                {
                    string itemString = row.Row.ItemArray[0].ToString();
                    if (itemString.StartsWith(newTxt,     StringComparison.CurrentCultureIgnoreCase))
                    {
                        found = true;
                        break;
                    }
                }
                else
                    e.SuppressKeyPress = true;
            }
            if (!found)
                e.SuppressKeyPress = true;
        }
    }