18

在 WinForms 2.0 中,ComboBox 具有自动完成功能,它显示一个自定义下拉列表,其中仅包含以输入文本开头的值。

但是,如果我想将有效值限制为仅出现在 ComboBox 的项目列表中的值,我可以通过设置DropDownStyleto来做到这一点DropDownList,这会阻止用户输入值。

但是,现在我无法使用需要用户输入的自动完成功能。

是否有另一种方法可以限制对列表的输入,同时仍然允许使用自动完成功能?请注意,我已经看到了一些自定义解决方案,但我真的很喜欢匹配的自动完成项目在下拉列表中显示的方式,即使原始列表可能不是,也可以排序。

编辑:我考虑过只验证输入的值,即测试用户输入是否在TextChanged事件中有效,甚至在使用Validating事件中。那么问题是预期的行为是什么?我是清除它们的值(空值也是无效的),还是使用默认值?最接近的匹配值?

Ps 还有其他的标签可以添加到这个问题吗?

4

9 回答 9

5

这个解决方案对我有用:

Private Sub myComboBox_Validating(sender As System.Object, e As System.ComponentModel.CancelEventArgs) Handles myComboBox.Validating
    If Not myComboBox.Items.Contains(myComboBox.Text) Then
        MsgBox("Please select a value from the list", MsgBoxStyle.Exclamation, "Value not available")
        e.Cancel = True
    End If
End Sub
于 2013-05-01T10:05:51.440 回答
4

您是否尝试过设置AutoCompleteMode = AutoCompleteMode.SuggestAppendAutoCompleteSource = AutoCompleteSource.ListItems?这允许用户输入,但它只接受ComboBox. 唯一的问题是 Win7 的行为发生了变化(请参阅ComboBox.SelectedValue 与 Windows 7 中的 DropDownStyle = DropDownList 时显示的文本不匹配)。

至于标签,你可以试试“combobox”和“.net”。

于 2010-01-13T15:33:39.547 回答
3

它可能就像这样简单:

Private Sub cbx_Validating(ByVal sender As Object, _
                           ByVal e As System.ComponentModel.CancelEventArgs) _
    Handles  cbxZip.Validating, cbxCity.Validating, cbxCountry.Validating

    'Prerequisites: object: combobox, style: dropdownlist, 
    'autocompletesource=listitems, autocompletemode<>none
    'check if the typed value is in the list, else cancel
    'if the value isn't found, 'findstring' will return -1
    'if cancel is set to True, one can't leave the field
    e.Cancel = sender.FindStringExact(sender.Text) < 0

    'make it obvious to the user there is an issue
    If e.Cancel Then Beep()
End Sub
于 2009-08-08T05:35:48.977 回答
2

您可以挂钩 keypress 或 textchanged 事件并验证输入的文本是否是至少一个列表项的初始子字符串匹配,如果不是则拒绝按键(或删除最近的字符)。我能想到的唯一问题是,不接受某些输入可能会让用户有点困惑(特别是在输入第一个字符时,此时自动完成列表还不可见,所以他们会'不知道什么是有效值)。

或者只是在下拉列表模式下使用它 - 人们仍然可以输入,它会跳转到第一个匹配的列表项......

于 2009-01-14T17:18:26.807 回答
1

您可以将“SuggestAppend 属性设置为 SuggestAppend”并将“AutoCompleteSource”设置为“ListItems”,这将在下拉列表中列出并添加您输入的字符。此外,如果没有选择,那么即使是 apprpiate ValueMemeber 也会被选择用于下拉菜单。

于 2010-06-08T07:58:40.387 回答
0

我想做同样的事情并遇到了这个问题。这是我想出的。

为组合框创建 KeyDown 事件处理程序并检查 Enter 键。请注意,在用户点击输入后,组合框中的文本被选中(如,被选中,就像您正在执行剪切或复制操作一样)并且焦点仍保留在组合框中。

如果按下输入,则调用验证函数,如果输入的值是好/坏,它将执行您认为必要的任何操作。

您可以在 Leave 事件处理程序中调用相同的函数,以防止用户在做出有效选择之前离开组合框。

private void uxWidgetsComboBox_KeyDown(object sender, KeyEventArgs e)
{
   if (e.KeyCode == Keys.Enter)
   {
      ValidateSelection();
   }
}

private void uxWidgetsComboBox_Leave(object sender, EventArgs e)
{
   if(!ValidateSelection())
   {
      uxWidgetsComboBox.Focus();
   }
}

或者类似的东西,但你明白了。

于 2010-03-10T02:51:38.223 回答
0

我有同样的问题......我问过同样的问题(如何强制用户将建议的条目输入 ComboBox?),然后我用事件实现它,但我得到了很多代码通过概括行为得到改善......请告诉我你是否容易得到它。谢谢!

于 2011-10-20T22:30:21.647 回答
0

我这样做的方法是在它们离开框时根据可能值列表检查值,并且不要让它们留下无效值。我不知道当您发现他们输入了无效值时您会如何处理它,但这是我过去所做的。

于 2009-01-14T16:17:09.910 回答
0

这对我有用。我使用 DataTable 作为数据源

 With cbo
    .AutoCompleteSource = AutoCompleteSource.ListItems
    .AutoCompleteMode = AutoCompleteMode.SuggestAppend
 End With

Private Sub cbo_Validating(sender As System.Object, e As System.ComponentModel.CancelEventArgs) Handles cbo.Validating
   If cbo.SelectedItem Is Nothing Then
       MessageBox.Show("Value entered not valid", "Message", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
       e.Cancel = True
   End If
End Sub
于 2016-10-06T15:30:05.897 回答