Скажем, у нас есть следующий код в Приложении Windows:
ComboBox comboBox = new ComboBox()
{
AutoCompleteMode = AutoCompleteMode.SuggestAppend,
AutoCompleteSource = AutoCompleteSource.ListItems,
DataSource = new string[] { "", "Ark", "Boat", "Bucket" },
DropDownStyle = ComboBoxStyle.DropDownList
};
this.Controls.Add(comboBox);
TextBox textBox = new TextBox()
{
Left = comboBox.Right,
Top = comboBox.Top,
ReadOnly = true
};
textBox.DataBindings.Add("Text", comboBox, "SelectedValue");
this.Controls.Add(textBox);
Никакое волшебство здесь, просто a ComboBox
связанный со списком строк. TextBox
дисплеи SelectedValue
из ComboBox
.
Я получаю неожиданное поведение, когда я ввожу "Блок" в ComboBox
и вкладка далеко. По некоторым причинам ComboBox
дисплеи "Лодка", но TextBox
дисплеи "Блок". Я ожидал бы, что они оба отобразят "Блок".
Это ведет себя как ожидалось, если я изменяюсь DropDownStyle
кому: DropDown
, но я не хочу, чтобы пользователи смогли ввести что-либо, что они хотят. Они должны только смочь ввести объекты, которые находятся в списке.
Еще более интересный то, что, после ввода "Блока" и переключения вкладок далеко, если я ввожу "Блок" снова, он отобразит "Блок" в обоих. Если я предпринимаю третью попытку, она возвращается для "Плавания на лодке" для ComboBox
и "Блок" для 'Текстового поля'. Таким образом, кажется, что это циклически повторяется через весь B.
Я не заметил это, пока я недавно не обновил от XP до Windows 7. Я не вижу, как это могло иметь какое-либо отношение к этому, но я вывожу его так или иначе.
Если это поведение корректно, кто-либо может сказать мне, что я должен делать для достижения моего ожидаемого поведения?
ОБНОВЛЕНИЕ Это казалось бы этим, связано с Windows 7. Все ведет себя как ожидалось в Режиме Windows XP. Может кто-либо еще запускающий Windows 7 пробует мой код и проверяет, что я не являюсь сумасшедшим?
Обходным путем может быть изменение DropDownStyle
на DropDownDown
и добавление следующего:
comboBox.Validating += new CancelEventHandler((o, e) =>
{
e.Cancel = (comboBox.DataSource as string[]).Contains(comboBox.Text) == false;
});
Это позволит пользователям набирать что угодно, но не даст им уйти из-под контроля, если они не набрали правильный элемент.
Тем не менее, недовольны изменением поведения с XP на Win 7.
.Я знаю, что этот ответ довольно старый, но мне нужен был ответ на эту ошибку Windows 7. Некоторое время я возился в стиле Ecyrb и пришел к следующему обходному пути:
Из InitForm() для Application Add this property:
Me.KeyPreview = True
Из того, где находится ComboBox:
Private mbTab As Boolean
Private miPrevIndex As Integer = -1
Private Sub DropDownListEx_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles Me.Validating
miPrevIndex = Me.SelectedIndex
MyBase.OnSelectedIndexChanged(e)
End Sub
Private Sub DropDownListEx_PreviewKeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.PreviewKeyDownEventArgs) Handles Me.PreviewKeyDown
mbTab = e.KeyCode = Windows.Forms.Keys.Tab
End Sub
Protected Overrides Sub OnDropDownClosed(ByVal e As System.EventArgs)
MyBase.OnDropDownClosed(e)
If Me.SelectedIndex <> miPrevIndex Then
If mbTab = True Then
Me.SelectedIndex = miPrevIndex
Else
miPrevIndex = Me.SelectedIndex
End If
MyBase.OnSelectedIndexChanged(e)
End If
End Sub
Теперь, в моем примере, я использую пользовательский элемент управления, который наследует comboBox. Поэтому вам нужно будет соединить эти элементы для вашего собственного использования.