如果用户点击表单上的其他位置,如何取消选择文本框?

时间:2011-08-26 17:21:57

标签: c# winforms textbox focus setfocus

目前在我的应用程序中,无法取消选择文本框。唯一的方法是选择另一个文本框。我的用户和我同意点击表单上的任何其他位置都应该取消选择当前的文本框。我尝试在许多控件上覆盖MouseDown并将焦点设置为随机标签,但它不适用于某些控件,如MenuStrip或scrollbars。有什么想法吗?

5 个答案:

答案 0 :(得分:2)

假设您的论坛上没有其他控件,请尝试添加可以获得焦点的Panel控件。

TabIndex控件上的Panel设置为小于TextBoxNumericUpDown控件的值。

现在,当您的主要表单获得焦点时,Panel应该会获得焦点,而不是TextBox区域。

ScreenShot

答案 1 :(得分: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);

答案 2 :(得分:1)

由于您可能在winform上有标签或任何其他控件,因此我会使用解决方案recommended here,并在单击表单时将焦点放在标签上。

最坏的情况是,您甚至可以添加位于-100,-100位置的标签,将其设置为Tab键顺序中的第一个,将Focus()设置为表单点击。

答案 3 :(得分:0)

我有一些“解决方法”给你。只是另一个控件(可以得到焦点)在后台。我为GridView测试了这个(它会将你的控件画成灰色) - 但你应该能够使用你想要的颜色的自定义控件来完成它,或者只是设置gridview(doh)的backgroundcolor。 这样,每次用户单击背景时,此backgroundcontrol都将获得焦点。

答案 4 :(得分:0)

这是通用答案:要在用户单击表单上的任何其他位置时取消选择文本框,请首先使控件失去焦点。为此订阅表单的点击事件:

private void Form1_Click(object sender, EventArgs e)
{
    this.ActiveControl = null;
}

接下来订阅你的 TextBoxes 到 Focus Leave 事件并将 SelectionLength 设置为 0(取消选择文本,不知何故它不会被取消选择,尽管文本框在失去焦点时不显示选择):

private void textBoxes_Leave(object sender, EventArgs e)
{
    TextBox txbox = sender as TextBox;
    txbox.SelectionLength = 0;
}

如果您将 TexBox 嵌套在自定义用户控件中,则必须以类似方式在该用户控件中添加事件。希望对其他人有所帮助。