2013-02-20 5 views
1

У меня есть приложение WinForms в Visual Studio 2010.Только выберите пункты списка из выпадающего списка

На форме у меня есть DataBound выпадающий, для которого я поставил autocompletesource = ListItems и AutoCompleteMode = SuggestAppend.

Теперь для этого функциональность для работы, я поставил dropdownstyle = раскрывающийся, так что пользователь может вводить текст

Но я хочу, чтобы пользователь мог выбрать только элемент доступный из его выпадающего списка.

Если пользователь вводит элемент, отличный от элементов списка, и оставляет поле со списком, пользователь не должен оставлять поле со списком.

Короче говоря, я хочу, чтобы пользователь мог выбирать элемент только из доступных списков, а не из того, что он вводит.

плз помощь

+0

Если вы установите 'DropDownStyle = DropDownList' и' AutoCompleteMode = Append', пользователь по-прежнему будет иметь возможность ввести значение для выбора пункта, они хотят, но они будут ограничены к элементам, которые в список. Вам действительно нужны они, чтобы иметь возможность ввести недопустимое значение, чтобы вы могли предупредить их о том, что это неверно? Потому что, если нет, это просто более запутанно. Предоставляя им возможность ввести любую ценность, это означает, что им разрешено это делать. –

+0

@StevenDoggart, я пробовал это, но если пользователь вводит несколько символов, он не работает. Его работа только для первого символа. Если пользователь нажимает «A», тогда будет отображаться первое слово, начинающееся с «A», но он не сможет найти элементы с символами после «A». –

+0

@StevenDoggart, я хочу, чтобы пользователь мог вводить несколько символов, а затем появляется предложение, и он выбирает элемент, но если этот элемент отсутствует в списке, он не может оставить поле со списком. –

ответ

3

Если вы установили DropDownStyle = DropDownList и AutoCompleteMode = Append, пользователь все равно сможет ввести значение, чтобы выбрать элемент, который они хотят, но они будут ограничены элементами, находящимися в списке.

Когда AutoCompleteMode = Append, он будет проверять последующие символы, набранные путем добавления их к искомому значению, если вы набираете их быстро, то есть. Если вы слишком долго ждали между нажатиями клавиш, он снова возвращается к поиску первой буквы.

Рассмотрите: вам действительно нужны они, чтобы иметь возможность ввести недопустимое значение, чтобы вы могли предупредить их о том, что это недействительно? Потому что, если нет, это просто более запутанно. Предоставляя им возможность ввести любую ценность, это означает, что им разрешено это делать.

3

Установите свойство «DropDownStyle» к «DROPDOWNLIST» и это остановит пользователя от ввода в комбо.

Надеюсь, это поможет.

0

Согласны с предыдущими ответами, что, чтобы ограничить доступ пользователей к недопустимым данным, целесообразно выбрать DropDownStyle = ComboBoxStyle.DropDownList. Но на всякий случай, если вы хотите, что хотите, вы можете использовать событие OnValidating элемента управления для проверки допустимых значений в отношении элементов списка. Или еще лучше, наследовать контроль и использовать его в проекте. Вот код, который я использую.

Namespace Relax.Controls 
    Public Class RelaxCombobox 
     Inherits ComboBox 

     Public Property RestrictContentToListItems As Boolean = True 

     Public Sub New() 
      With Me 
       .AutoCompleteSource = Windows.Forms.AutoCompleteSource.ListItems 
       .AutoCompleteMode = Windows.Forms.AutoCompleteMode.SuggestAppend 
      End With 
     End Sub 

     Protected Overrides Sub OnValidating(e As System.ComponentModel.CancelEventArgs) 
      If RestrictContentToListItems AndAlso Me.Items.Count > 0 Then 
       Dim index As Integer = Me.FindString(Me.Text) 
       If index > -1 Then 
        Me.SelectedIndex = index 
       Else 
        e.Cancel = True 
        Me.Text = "" 
        Beep() 
       End If 
      End If 
      MyBase.OnValidating(e) 
     End Sub 
    End Class 
End Namespace 

Обратите внимание: не разрешает пользователю покидать элемент управления, это плохой дизайн пользовательского интерфейса.

0

попробуйте следующее:

Private Sub ComboBox1_Leave(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.Leave 
    If (ComboBox1.SelectedIndex = -1) Then 
     ComboBox1.Focus() 
    End If 
End Sub 
+0

также: Private Sub ComboBox1_Validating (ByVal отправителя в качестве объекта, ByVal е Как System.ComponentModel.CancelEventArgs) Ручки ComboBox1.Validating Если (ComboBox1.SelectedIndex = -1) Тогда e.Cancel = True End If End Sub –

1

я смотрю какое-то решение, но без использования ограничения DropDownList (набрав время ограниченных пользователей должны быть быстро).

Предыдущий код кажется хорошим для меня, но не вызывается во время ввода того, что нам нужно. ComboBox I переключается на AutoCompleteMode = SuggestAppend, AutoCompleteSource = ListItems, DoprDownStyle = DropDown. Это позволяет пользователю напрямую печатать на коробке и не ограничено по времени.

Это мой код, я надеюсь, поможет кому-нибудь:

Private Sub ComboBox1_KeyUp(sender As Object, e As KeyEventArgs) Handles ComboBox1.KeyUp 
    If ComboBox1.Text <> String.Empty Then 
    If ComboBox1.FindString(cboSkupina.Text) = -1 Then 'if is value -1 typed text is not in list 
     ComboBox1.Text = Mid(ComboBox1.Text, 1, Len(ComboBox1.Text) - 1) 'Delete not valid character 
     ComboBox1.SelectionStart = Len(ComboBox1.Text) + 1 'Place cursor at the end 
    End If 
    End If 
End Sub 
0

Просто добавьте следующий фрагмент кода в KeyPress случае из ComboBox. Не забудьте заменить имя Combobox своим.

Private Sub ComboBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles ComboBox1.KeyPress 
     If e.KeyChar = ControlChars.Back AndAlso e.KeyChar = ControlChars.Back Then 
      Return 
     End If 

     Dim t As String = ComboBox1.Text 
     Dim typedT As String = t.Substring(0, ComboBox1.SelectionStart) 
     Dim newT As String = typedT + e.KeyChar 

     Dim i As Integer = ComboBox1.FindString(newT) 
     If i = -1 Then 
      e.Handled = True 
     End If 
End Sub 
Смежные вопросы