如何在C#中防止手动输入到ComboBox?

71

我在C#中有一个表单,其中使用了ComboBox。我该如何防止用户在ComboBox中手动输入文本呢?

this.comboBoxType.Font = new System.Drawing.Font("Arial", 15.75F);
this.comboBoxType.FormattingEnabled = true;
this.comboBoxType.Items.AddRange(new object[] {
            "a",
            "b",
            "c"});
this.comboBoxType.Location = new System.Drawing.Point(742, 364);
this.comboBoxType.Name = "comboBoxType";
this.comboBoxType.Size = new System.Drawing.Size(89, 32);
this.comboBoxType.TabIndex = 57;   

我希望A、B、C是唯一的选项。


可能是如何禁用C#中组合框元素的编辑?的重复问题。 - sɐunıɔןɐqɐp
5个回答

175

只需将您的组合框设置为DropDownList:

this.comboBoxType.DropDownStyle = ComboBoxStyle.DropDownList;

1
这样做,不允许我输入默认的“选择项目”文本? - Demodave
只需在上面的代码块末尾添加 this.comboBoxType.SelectedIndex = 0; 即可将“默认”设置为第一项。 - KeyszerS

23

我认为你想将DropDownStyle设置为DropDownList。

this.comboBoxType.DropDownStyle = 
    System.Windows.Forms.ComboBoxStyle.DropDownList;

或者,您可以在WinForms设计器中选择控件,转到属性窗口,并将 "DropDownStyle" 属性更改为 "DropDownList"。


8
您可以通过在控件的KeyPress事件中添加e.Handled = true来抑制按键处理:
private void Combo1_KeyPress(object sender, KeyPressEventArgs e)
{
    e.Handled = true;
}

2
您仍然可以在组合框中右键单击所选文本,然后点击剪切,哇,文本就消失了。 - ajeh
1
即使您可以删除该字符。 - Sushil Jadhav

2

我希望保留手动插入内容的能力,但限制选择的项只能是列表中的内容。我会将此事件添加到ComboBox中。只要你获取SelectedItem而不是Text,就可以获得正确的预定义项; a、b和c。

private void cbx_LostFocus(object sender, EventArgs e)
{
  if (!(sender is ComboBox cbx)) return;
  int i;
  cbx.SelectedIndex = (i = cbx.FindString(cbx.Text)) >= 0 ? i : 0;
}

1

那么为什么要使用ComboBox?

C#有一个叫做Listbox的控件。技术上,ComboBox与Listbox的区别在于ComboBox可以接收输入,因此如果它不是您需要的控件,则建议您使用ListBox

这里提供了Listbox的使用指南:C# ListBox


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接