0

オートコンプリートモードでAutoCompleteCustomSourceforを使用しています。これは期待どおりに機能します。ただし、オートコンプリートの提案が表示された場合でも、ユーザーが入力したテキストだけにアクセスする必要があります。つまり、提案が表示されると、のプロパティは提案を返します。TextBoxAppendTextTextBox

ユーザーが入力した文字列だけを取得する方法はありますか?

更新:私の制限の1つは、Appendオートコンプリートモードを使用する必要があることです。

4

3 に答える 3

1

プロパティを「提案」だけに設定してみましたか。そうすれば、ユーザーが提案を選択するまで、テキストボックスのテキストプロパティは常に文字列で入力されたユーザーになります。

于 2012-08-15T18:18:01.063 に答える
0

例として、次のことを行う必要があります。これは、Designer.cs ファイルでテストしたばかりの Windows プロジェクトから貼り付けられたものです。

Win フォームの例

this.txtStudGrade.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.Suggest;
this.txtStudGrade.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems;

Designer DropDownList AutoCompleteSource.ListItems で設定します。Designer DropDownList AutoCompleteMode = AutoCompleteMode.Suggest; で設定します。

Webフォーム JQueryを使用してそれを行うことができます 実際の例については、以下のリンクを確認してください

JQuery を使用したオートコンプリート

于 2012-08-15T19:07:47.533 に答える
0

ユーザーが入力したデータのみを取得する単純なメカニズムはないようです。この問題を解決しようとした後、その理由を理解できました。ユーザーが入力したデータを構成するものが常に明確であるとは限らず、Microsoftはその質問に取り組まないことを決定したようです。

イベントに登録して、手動でユーザー データを追跡することにしましたTextChanged。キーストロークごとにこのイベントがトリガーされるため、 の前の値を追跡することで、追加オートコンプリートまたは貼り付け操作が発生したTextかどうかを判断できます。

以下のコード スニペットTextChangedは、カスタムTextBoxクラスのイベント ハンドラーからのものです。UserTextユーザーが入力したデータ (タイプstring) を含みます。

if (string.IsNullOrEmpty(UserText) || 
    UserText.Length > Text.Length || 
    UserText.Length + 1 == Text.Length)
{
  UpdateUserText(Text);
}

UpdateUserText(string)最初に変更が発生したかどうかを判別し、変更が発生した場合は、新しい値を に割り当ててUserTextイベントを発行します。貼り付け操作の場合、ここに投稿されたソリューションを使用できます。ただし、次のことを選択しました。

MouseClick += UpdateUserText;
KeyUp += UpdateUserText;

//--------------------------------------------------------

private void UpdateUserText(object sender, EventArgs args)
{
  if (SelectionLength == 0)
  {
    UpdateUserText(Text);
  }
}

このようにして、 のテキストがTextBox強調表示されなくなった場合は、ユーザーが入力したテキストになったと想定します。これにより、貼り付け操作 (キーボードまたはマウスのいずれかを使用) が処理され、ユーザーが矢印キーを押してオートコンプリートの提案を受け入れるようになります。

私が無視することにしたエッジ ケースの 1 つは、ユーザーが単語全体を入力して最後の文字を入力した場合です。この場合、オートコンプリートの提案とユーザー入力を区別できません。

StringBuilderユーザーが入力したデータを手動で追跡するために を使用することも検討しましたが、 で既に構築stringされている を追跡するよりも多くの労力が必要だと思いますText

誰かに提案があれば、私は常により良い実装を受け入れています:)

于 2012-08-27T16:38:10.790 に答える