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

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

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

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

现在,当您的主窗体获得焦点时, 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位置的标签,将其设置为Tab键顺序中的第一个,将Focus()设置为表单点击。

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