6

現在、私のアプリケーションでは、テキストボックスの選択を解除することはできません。唯一の方法は、別のテキストボックスを選択することです。ユーザーと私は、フォームの他の場所をクリックすると、現在のテキストボックスの選択が解除されることに同意します。多くのコントロールでMouseDownをオーバーライドし、フォーカスをランダムラベルに設定しようとしましたが、MenuStripやスクロールバーなどの一部のコントロールでは機能しません。何か案は?

4

5 に答える 5

2

フォーラムに他のコントロールがないと仮定して、フォーカスを受け取ることができるパネルコントロールを追加してみてください。

TabIndexコントロールのオンを、またはコントロールが持っているPanelものよりも小さいものに設定します。TextBoxNumericUpDown

これで、メインフォームがフォーカスPanelを受け取ると、領域ではなくフォーカスを受け取る必要がありますTextBox

ScreenShot

于 2011-08-26T17:36:33.907 に答える
2

最近、同様の問題が発生しました。私のインターフェースは非常に複雑で、たくさんのパネルとタブページがあるので、私が見つけたより単純な答えはどれもうまくいきませんでした。

私の解決策は、フォーム内のフォーカスできないすべてのコントロールにマウスクリックハンドラーをプログラムで追加することでした。これにより、フォーム上のラベルのフォーカスが試みられます。別のタブページでは特定のラベルに焦点を合わせることができないため、ループしてすべてのラベルに焦点を合わせることになりました。

実行するコードは次のとおりです。

    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);
于 2014-10-14T01:24:21.940 に答える
1

おそらく、WinFormにラベルまたはその他のコントロールがあるので、ここで推奨されているソリューションを使用して、フォームがクリックされたときにラベルに焦点を合わせます。

最悪の場合、-100、-100の位置にラベルを追加し、タブオーダーの最初に設定して、フォームクリックでFocus()することもできます。

于 2011-08-26T19:03:26.030 に答える
0

私はあなたのためにある種の「回避策」を持っています。バックグラウンドで(フォーカスを取得できる)別のコントロールだけです。これをGridView(コントロールを灰色にペイントします)でテストしましたが、必要な色のカスタムコントロールを使用するか、グリッドビューの背景色(doh)を設定するだけで実行できるはずです。このように、ユーザーが背景をクリックするたびに、このbackgroundcontrolがフォーカスを取得します。

于 2011-08-26T17:42:56.367 に答える
0

これは一般的な答えです。ユーザーがフォーム上の他の場所をクリックしたときに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をカスタムユーザーコントロールにネストしている場合は、同様の方法でそのユーザーコントロール内にイベントを追加する必要があります。それが他の誰かに役立つことを願っています。

于 2021-02-14T19:12:50.757 に答える