マスクされたテキストボックスにキャレットを配置するためのデフォルトの動作をオーバーライドできるようにしたいと考えています。
デフォルトでは、マウスがクリックされた場所にキャレットが配置されます。マスクされたテキストボックスには、マスクのために既に文字が含まれています。
この投稿に記載されているように、キャレットを非表示にできることはわかっています。コントロールがフォーカスを取得したときに、テキストボックスの先頭にキャレットを配置するための同様のものがあります。
マスクされたテキストボックスにキャレットを配置するためのデフォルトの動作をオーバーライドできるようにしたいと考えています。
デフォルトでは、マウスがクリックされた場所にキャレットが配置されます。マスクされたテキストボックスには、マスクのために既に文字が含まれています。
この投稿に記載されているように、キャレットを非表示にできることはわかっています。コントロールがフォーカスを取得したときに、テキストボックスの先頭にキャレットを配置するための同様のものがあります。
これでうまくいくはずです:
private void maskedTextBox1_Enter(object sender, EventArgs e)
{
this.BeginInvoke((MethodInvoker)delegate()
{
maskedTextBox1.Select(0, 0);
});
}
Abbas の作業ソリューションを改善するには、これを試してください。
private void ueTxtAny_Enter(object sender, EventArgs e)
{
//This method will prevent the cursor from being positioned in the middle
//of a textbox when the user clicks in it.
MaskedTextBox textBox = sender as MaskedTextBox;
if (textBox != null)
{
this.BeginInvoke((MethodInvoker)delegate()
{
int pos = textBox.SelectionStart;
if (pos > textBox.Text.Length)
pos = textBox.Text.Length;
textBox.Select(pos, 0);
});
}
}
このイベント ハンドラーは複数のボックスで再利用でき、ユーザーが入力したデータの中央にカーソルを配置する機能を奪うことはありません (つまり、ボックスが空でない場合にカーソルを 0 番目の位置に強制しません)。
これは、標準のテキスト ボックスをより厳密に模倣していると思います。残っている唯一の不具合 (私が見ることができる) は、「Enter」イベントの後、xe がマウスを押したまま最後までドラッグすると、ユーザーがまだ (空の) マスク プロンプトの残りを選択できることです。
これは、MaskedTextBoxes のデフォルトの動作よりも大幅に改善されています。ありがとう!
Ishmaeel の優れたソリューションにいくつかの変更を加えました。カーソルを移動する必要がある場合にのみ、BeginInvoke を呼び出すことを好みます。また、さまざまなイベント ハンドラーからメソッドを呼び出すので、入力パラメーターはアクティブな MaskedTextBox です。
private void maskedTextBoxGPS_Click( object sender, EventArgs e )
{
PositionCursorInMaskedTextBox( maskedTextBoxGPS );
}
private void PositionCursorInMaskedTextBox( MaskedTextBox mtb )
{
if (mtb == null) return;
int pos = mtb.SelectionStart;
if (pos > mtb.Text.Length)
this.BeginInvoke( (MethodInvoker)delegate() { mtb.Select( mtb.Text.Length, 0 ); });
}
//not the prettiest, but it gets to the first non-masked area when a user mounse-clicks into the control
private void txtAccount_MouseUp(object sender, MouseEventArgs e)
{
if (txtAccount.SelectionStart > txtAccount.Text.Length)
txtAccount.Select(txtAccount.Text.Length, 0);
}
部分的な回答: MouseClick イベントで長さ 0 の選択をコントロールに割り当てることで、キャレットを配置できます。次に例を示します。
MaskedTextBox1.Select(5, 0)
...テキストボックスの5番目の文字位置にキャレットを設定します。
この回答が部分的なものにすぎない理由は、クリック時にキャレットを配置する位置を決定する一般的に信頼できる方法が思いつかないためです。これは一部のマスクでは可能かもしれませんが、いくつかの一般的なケース (米国の電話番号マスクなど) では、マスクとプロンプト文字を実際のユーザー入力から分離する簡単な方法が思い浮かびません...