現在、私のアプリケーションでは、テキストボックスの選択を解除することはできません。唯一の方法は、別のテキストボックスを選択することです。ユーザーと私は、フォームの他の場所をクリックすると、現在のテキストボックスの選択が解除されることに同意します。多くのコントロールでMouseDownをオーバーライドし、フォーカスをランダムラベルに設定しようとしましたが、MenuStripやスクロールバーなどの一部のコントロールでは機能しません。何か案は?
5 に答える
フォーラムに他のコントロールがないと仮定して、フォーカスを受け取ることができるパネルコントロールを追加してみてください。
TabIndex
コントロールのオンを、またはコントロールが持っているPanel
ものよりも小さいものに設定します。TextBox
NumericUpDown
これで、メインフォームがフォーカスPanel
を受け取ると、領域ではなくフォーカスを受け取る必要がありますTextBox
。
最近、同様の問題が発生しました。私のインターフェースは非常に複雑で、たくさんのパネルとタブページがあるので、私が見つけたより単純な答えはどれもうまくいきませんでした。
私の解決策は、フォーム内のフォーカスできないすべてのコントロールにマウスクリックハンドラーをプログラムで追加することでした。これにより、フォーム上のラベルのフォーカスが試みられます。別のタブページでは特定のラベルに焦点を合わせることができないため、ループしてすべてのラベルに焦点を合わせることになりました。
実行するコードは次のとおりです。
private void HookControl(Control controlToHook)
{
// Add any extra "unfocusable" control types as needed
if (controlToHook.GetType() == typeof(Panel)
|| controlToHook.GetType() == typeof(GroupBox)
|| controlToHook.GetType() == typeof(Label)
|| controlToHook.GetType() == typeof(TableLayoutPanel)
|| controlToHook.GetType() == typeof(FlowLayoutPanel)
|| controlToHook.GetType() == typeof(TabControl)
|| controlToHook.GetType() == typeof(TabPage)
|| controlToHook.GetType() == typeof(PictureBox))
{
controlToHook.MouseClick += AllControlsMouseClick;
}
foreach (Control ctl in controlToHook.Controls)
{
HookControl(ctl);
}
}
void AllControlsMouseClick(object sender, MouseEventArgs e)
{
FocusLabels(this);
}
private void FocusLabels(Control control)
{
if (control.GetType() == typeof(Label))
{
control.Focus();
}
foreach (Control ctl in control.Controls)
{
FocusLabels(ctl);
}
}
次に、これをForm_Loadイベントに追加します。
HookControl(this);
おそらく、WinFormにラベルまたはその他のコントロールがあるので、ここで推奨されているソリューションを使用して、フォームがクリックされたときにラベルに焦点を合わせます。
最悪の場合、-100、-100の位置にラベルを追加し、タブオーダーの最初に設定して、フォームクリックでFocus()することもできます。
私はあなたのためにある種の「回避策」を持っています。バックグラウンドで(フォーカスを取得できる)別のコントロールだけです。これをGridView(コントロールを灰色にペイントします)でテストしましたが、必要な色のカスタムコントロールを使用するか、グリッドビューの背景色(doh)を設定するだけで実行できるはずです。このように、ユーザーが背景をクリックするたびに、このbackgroundcontrolがフォーカスを取得します。
これは一般的な答えです。ユーザーがフォーム上の他の場所をクリックしたときにTextBoxの選択を解除するには、最初にコントロールを作成してフォーカスを失います。このために、フォームのクリックイベントにサブスクライブします。
private void Form1_Click(object sender, EventArgs e)
{
this.ActiveControl = null;
}
次に、TextBoxをFocus Leaveイベントにサブスクライブし、SelectionLengthを0に設定します(テキストの選択を解除するには、フォーカスを失ったときにtextboxに選択が表示されないのに、どういうわけか選択が解除されません)。
private void textBoxes_Leave(object sender, EventArgs e)
{
TextBox txbox = sender as TextBox;
txbox.SelectionLength = 0;
}
TexBoxをカスタムユーザーコントロールにネストしている場合は、同様の方法でそのユーザーコントロール内にイベントを追加する必要があります。それが他の誰かに役立つことを願っています。