6

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

4

5 回答 5

2

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

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

现在,当您的主窗体接收焦点时,Panel应该接收焦点而不是TextBox区域。

截屏

于 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 测试了这个(它将把你的控件涂成灰色) - 但你应该能够使用你想要的颜色的自定义控件来做到这一点,或者只是设置 gridview 的背景颜色(doh)。这样,每次用户单击背景时,此背景控件都会获得焦点。

于 2011-08-26T17:42:56.367 回答
0

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

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;
}

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

于 2021-02-14T19:12:50.757 回答