在用户控件 Windows 应用程序中保持焦点

maintaining focus in user controls Windows application

我有一个使用 c# 的 windows 应用程序。我创建了一个表单 frmMain,当用户登录时会加载该表单。用户有 4 个选项,例如 Customer CreationSupplier Creation , 员工创建, 用户创建

这很好用。

焦点出现问题。当用户加载 Customer 用户控件并填写一些数据时,假设用户位于第 4 个控件(Textbox/Combobox 或任何其他 Windows 表单输入控件)和突然他点击 CreateUser,然后 CreateUser 控件加载,但焦点仍然在 Customer 用户控件中的第 4 个控件上。

我想要的是将焦点设置在当前用户控件上,如果它是新加载的,那么将焦点设置在默认控件上。

请检查我使用的代码,

// this method gets called if the form was opened earlier
  private void ShowOpenForm(ControlItem _item)
        {
            try
            {
                //Get item from menu
                ControlItem _menuI = null;
                foreach (ToolStripmenuI menuI in tsmenuWindow.DropDownItems)
                {
                    _menuI = (ControlItem)menuI.Tag;
                    if (_menuI.Control.Name.ToLower() == _item.Control.Name.ToLower())
                    {
                        break;
                    }
                    _menuI = null;
                }
                if (_menuI != null)
                {
                    WmenuI_ClearAllSelection();
                    for (int index = 0; index < PnlUserCtrl.Controls.Count; index++)
                    {
                        Control ctl = PnlUserCtrl.Controls[index];
                        if (ctl.Name.ToLower() == _menuI.Control.Name.ToLower())
                        {
                            ctl.Visible = true;
                            ctl.BringToFront();


                            break;
                        }
                    }
                    WmenuI_SetCurrentItemChecked(_menuI);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }









//User can navigate to opened items from menu as well

  private void WindowMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                ControlItem _item = (ControlItem)((ToolStripMenuItem)sender).Tag;
                WmenuI_ClearAllSelection();
                for (int index = 0; index <  PnlUserCtrl.Controls.Count; index++)
                {
                    Control ctl =  PnlUserCtrl.Controls[index];
                    if (ctl.Name.ToLower() == _item.Control.Name.ToLower())
                    {
                        ctl.Visible = true;
                        ctl.BringToFront();
                        if (ctl is BaseControl)
                        {
                            ((BaseControl)ctl).SetFocus();  // This sets the focus to default textbox
                        }

                        break;
                    }
                }
                WmenuI_SetCurrentItemChecked(_item);
            }
            catch (Exception ex)
            {
               MessageBox.Show(ex.Message);
            }
        }

但是这个设置焦点在默认的文本框上。不在用户移动到其他用户控件的控件上。

为了获得更好的答案,最好在问题中提供一些代码。 您可以使用 SetFocus() 方法根据需要手动操作焦点。对于你的问题,我相信你可以有一个 Control 类型的对象,然后你可以将它设置为你想要关注的默认控件。然后处理控件的所有 GotFocus 方法并设置该对象的值。 每当您希望将焦点恢复到最后一项时,您可以调用 [your object].SetFocus()。 这只是一个想法。看看有没有帮助。