代码之家  ›  专栏  ›  技术社区  ›  Andrew

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

  •  0
  • Andrew  · 技术社区  · 15 年前

    我正在处理一个接受和验证地址的用户控件。这些地址都在特定的域内(特别是澳大利亚)。

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

    当用户输入郊区名称的一部分并点击选项卡并进入状态字段时,我查询数据库以查看是否可以理解部分郊区。如果可以的话,我会为他们填写完整的郊区、州和邮政编码。例如,澳大利亚只有一个郊区叫“Boronia”,所以用户可以输入“boro”,点击标签,表格中填充“boronia”、“vic”和“3155”。

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

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

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

    但是,当我将它重构为用户控件时,它失败了。有人能把我推向正确的方向吗?

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

    5 回复  |  直到 13 年前
        1
  •  4
  •   Henk Holterman    15 年前

    我以前做过类似的事情,看起来应该是:

    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未在“属性”窗口中列出。进入事件不适用于此,它被称为太早了。

        2
  •  3
  •   Eric King    15 年前

    也许您可以让用户控件在事件完成后引发事件,并且 窗体可以通过将焦点设置在需要的位置来处理事件…

        3
  •  0
  •   SwDevMan81 Chris Barlow    15 年前

    您是否试图设置控件本身的焦点?我将尝试在控件内的文本框上设置焦点。

        4
  •  0
  •   Eric    15 年前

    我对细节有点模糊,因为我已经转到了WPF,不再做太多的ASP.NET,但是您应该能够从用户控件调用页面变量。((textbox)page.findcontrol(“txtmytextbox)).focus();可能会这样做。

    否则,您可能会在页面中抛出一个javascript函数来执行此操作,并调用它。

        5
  •  0
  •   Jason Plank dvancouver    13 年前

    您可以使用以下代码控制用户控件中选项卡的外观。 在这种情况下,tab键将焦点放在父窗体或用户控件中的下一个控件上。

    protected override bool ProcessDialogKey(Keys keyData)
            {
                if (keyData != Keys.Tab)
                {
                    return base.ProcessDialogKey(keyData);
                }
                Parent.SelectNextControl(this, true, true, false,false);
                return false;
            }