有没有办法让Windows窗体组合框只读? 具体来说:用户应该能够键入,但只允许使用框中的那些值(使用自动完成或从列表中选择)。
或者是使用验证事件的唯一方法吗?
问候
马里奥
答案 0 :(得分:3)
您可以将DropDownStyle设置为DropDownList,但这实际上不允许键入(但它允许使用键盘进行选择)。
如果您确实希望用户能够键入/查看不完整的单词,则必须使用事件。验证事件将是最佳选择。
答案 1 :(得分:3)
如果您在用户输入内容时设置AutoCompleteMode = SuggestAppend
和AutoCompleteSource = ListItems
,则组合框会自动显示以键入的字符开头的条目。
然后,通过处理SelectedIndexChanged
或SelectedValueChanged
事件,您可以在用户输入值列表中存在的值时拦截。
如果您也绝对不希望用户键入列表中没有的任何内容,那么您必须处理例如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;
}
}