用户控件如何将焦点传递给父窗体上的控件?

时间:2009-08-12 02:58:21

标签: c# winforms

我正在开发一个接受并验证地址的用户控件。地址都在特定的域内(特别是澳大利亚)。

在地址用户控件中,我有三个字段:郊区,州和邮政编码(也称为邮政编码)。

当用户键入部分郊区名称并点击TAB并进入状态字段时,我查询数据库以查看是否可以理解部分郊区。如果可以,我会为他们填写完整的郊区,州和邮政编码。例如,澳大利亚只有一个名为“BORONIA”的郊区,因此用户可以键入“BORON”,点击TAB,表格中填充“BORONIA”,“VIC”和“3155”。

我遇到的问题是,在填写完这些字段之后,我想跳过州和邮政编码字段,然后转到表单上的下一个控件。因为这些地址字段在用户控件中,所以我实际上希望将焦点设置为父窗体上的下一个控件。

我知道那个控件是什么,但是.focus()和.Select()都不会移动焦点。数据库查询和字段填充在状态字段的Enter事件中完成。

我有一个不是用户控件的相同地址处理逻辑的早期版本:它全部内联在数据输入表单上,在那种情况下一切正常。在状态字段的Enter方法中,我可以将控制权传递给下一个字段。

然而,当我将其重构为用户控件时,它失败了。任何人都可以朝着正确的方向推动我吗?

编辑:我应该注意,我可以将焦点转移到我的用户控件中的其他控件,所以我知道基本逻辑是正确的。这就是为什么我认为这是关于用户控件和父控件,而不是我的控件选择和.Select()调用。

5 个答案:

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