在用户控件 Windows 应用程序中保持焦点
maintaining focus in user controls Windows application
我有一个使用 c# 的 windows 应用程序。我创建了一个表单 frmMain
,当用户登录时会加载该表单。用户有 4 个选项,例如 Customer Creation、Supplier 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()
。
这只是一个想法。看看有没有帮助。
我有一个使用 c# 的 windows 应用程序。我创建了一个表单 frmMain
,当用户登录时会加载该表单。用户有 4 个选项,例如 Customer Creation、Supplier 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()
。
这只是一个想法。看看有没有帮助。