ユーザーが入力したデータのみを取得する単純なメカニズムはないようです。この問題を解決しようとした後、その理由を理解できました。ユーザーが入力したデータを構成するものが常に明確であるとは限らず、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
。
誰かに提案があれば、私は常により良い実装を受け入れています:)