如何让父母控制知道它的孩子有焦点?

时间:2010-03-23 12:06:03

标签: .net winforms focus

想象一下,我在3x3磁贴中有一个带有9个控件(TabbedStuffControl)的Form,这些控件包含包含另一个带ListBoxes和TextBoxes的控件(StuffControl)的TabControls。

我想知道让TabbedStuffControl让它的孩子获得焦点的正确方法吗?例如用户点击StuffControl的文本框或将某些东西拖到StuffControl的列表框中。最终,表单应该知道哪个TabbedStuffControl是活动的

我是否需要连接TextBoxes和ListBoxes以及TabControls的 GotFocus 事件,然后发送另一个事件,最终让Form知道谁有焦点?我认为应该有一个更简单的方法 - 以某种方式TabbedStuffControl 知道它的孩子得到了焦点,所以在代码中只有一个地方我会挂钩。

感谢。

2 个答案:

答案 0 :(得分:2)

使用Enter事件(比GotFocus更好)肯定是一个很好的方法。订阅所有控件的处理程序,然后在Enter事件处理程序中找到控件的父级。此示例代码演示了该方法:

  public partial class Form1 : Form {
    public Form1() {
      InitializeComponent();
      wireEnter(this.Controls);
    }
    private void wireEnter(Control.ControlCollection ctls) {
      // Hook Enter event for all controls
      foreach (Control ctl in ctls) {
        ctl.Enter += ctl_Enter;
        wireEnter(ctl.Controls);
      }
    }

    TabbedStuffControl mParent;

    private void ctl_Enter(object sender, EventArgs e) {
      // Find parent
      Control parent = (sender as Control).Parent;
      while (parent != null && !(parent is TabbedStuffControl)) parent = parent.Parent;
      if (parent != mParent) {
        // Parent changed, do something.  Watch out for null
        //....
        mParent = parent as TabbedStuffControl;
      }
    }
  }

答案 1 :(得分:0)

你必须使用COM:

// Import GetFocus() from user32.dll
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Winapi)]
internal static extern IntPtr GetFocus();

protected Control FocusControl
{
    get
    {
        Control focusControl = null;
        IntPtr focusHandle = GetFocus();

        if (focusHandle != IntPtr.Zero)
            // returns null if handle is not to a .NET control
            focusControl = Control.FromHandle(focusHandle);

        return focusControl;
    }
}