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.SuggestAppendしてみましたAutoCompleteSource = AutoCompleteSource.ListItemsか?これにより、ユーザーは入力できますが、 にある単語のみを受け入れますComboBox。唯一の問題は、Win7 で動作が変更されたことです ( Windows 7 で DropDownStyle = DropDownList の場合、ComboBox.SelectedValue が表示されたテキストと一致しないを参照してください)。

タグに関しては、「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 イベントをフックして、入力されたテキストが少なくとも 1 つのリスト項目の最初の部分文字列と一致することを検証し、そうでない場合は keypress を拒否 (または最新の文字を削除) することができます。これに関して私が考えることができる唯一の問題は、一部の入力が受け入れられないことがユーザーを少し混乱させる可能性があることです (特に最初の文字を入力するとき、その時点でオートコンプリート リストはまだ表示されないため、彼らは勝ちました)有効な値がわからない)。

または、ドロップダウンリストモードで使用するだけです-人々は引き続き入力でき、最初に一致するリスト項目にジャンプします...

于 2009-01-14T17:18:26.807 に答える
1

「SuggestAppend プロパティを SuggestAppend に」、「AutoCompleteSource」を「ListItems」に設定すると、入力した文字がドロップダウン リストに一覧表示されて追加されます。また、選択されていない場合は、適切な ValueMemeber もドロップダウンに選択されます。

于 2010-06-08T07:58:40.387 に答える
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 に答える
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 に答える