我正在开发一个接受并验证地址的用户控件。地址都在特定的域内(特别是澳大利亚)。
在地址用户控件中,我有三个字段:郊区,州和邮政编码(也称为邮政编码)。
当用户键入部分郊区名称并点击TAB并进入状态字段时,我查询数据库以查看是否可以理解部分郊区。如果可以,我会为他们填写完整的郊区,州和邮政编码。例如,澳大利亚只有一个名为“BORONIA”的郊区,因此用户可以键入“BORON”,点击TAB,表格中填充“BORONIA”,“VIC”和“3155”。
我遇到的问题是,在填写完这些字段之后,我想跳过州和邮政编码字段,然后转到表单上的下一个控件。因为这些地址字段在用户控件中,所以我实际上希望将焦点设置为父窗体上的下一个控件。
我知道那个控件是什么,但是.focus()和.Select()都不会移动焦点。数据库查询和字段填充在状态字段的Enter事件中完成。
我有一个不是用户控件的相同地址处理逻辑的早期版本:它全部内联在数据输入表单上,在那种情况下一切正常。在状态字段的Enter方法中,我可以将控制权传递给下一个字段。
然而,当我将其重构为用户控件时,它失败了。任何人都可以朝着正确的方向推动我吗?
编辑:我应该注意,我可以将焦点转移到我的用户控件中的其他控件,所以我知道基本逻辑是正确的。这就是为什么我认为这是关于用户控件和父控件,而不是我的控件选择和.Select()调用。
答案 0 :(得分:4)
我做了类似的事情,它应该看起来像:
private void InputsUserControl_Load(object sender, EventArgs e)
{
altNameTextBox.GotFocus += new EventHandler(altNameTextBox_GotFocus);
}
void altNameTextBox_GotFocus(object sender, EventArgs e)
{
string s = nameTextBox.Text.Trim();
if (!string.IsNullOrEmpty(s))
{
this.Parent.SelectNextControl(this, true, true, true, false);
}
}
请注意,属性窗口中未列出GotFocus。并且Enter事件对此不起作用,它被称为太早。
答案 1 :(得分:3)
也许你可以让用户控件在完成后引发一个事件, page 表单可以通过将焦点设置在需要的位置来处理事件...
答案 2 :(得分:0)
您是否尝试设置控件本身的焦点?我会尝试将焦点设置在控件中的文本框上。
答案 3 :(得分:0)
我对细节有点模糊,因为我已经转移到WPF并且不再做很多ASP.NET,但你应该能够从用户控件调用Page变量。 ((文本框)Page.FindControl(“txtMyTextbox)”。Focus();可能会这样做。
否则你可能会在页面中抛出一个javascript函数来执行它,然后调用它。
答案 4 :(得分:0)
您可以使用以下代码控制usercontrol中TAB的行为。 在这种情况下,TAB键将下一个控件聚焦在父窗体或用户控件中。
protected override bool ProcessDialogKey(Keys keyData)
{
if (keyData != Keys.Tab)
{
return base.ProcessDialogKey(keyData);
}
Parent.SelectNextControl(this, true, true, false,false);
return false;
}