点击TreeView节点上打开一个新的MDI窗体,焦点离开第一个表单上(Click on treev

2019-07-31 12:10发布

我想点击一个TreeView节点后,打开一个新的形式。

在第一个MDI窗体我有一个TreeView,当我点击树中的一个节点上观看第二MDI形式被打开,但第一种形式保持焦点。 我希望新的形式具有焦点。

我已经注意到了第一种形式的_Enter事件被解雇好像有什么东西是设置焦点回到第一种形式。

还有,做同样的功能的第一个表单上的一个按钮,它的伟大工程。 我有一种感觉树形视图有一些特殊的属性设置为使焦点回到第一种形式。

下面是代码开口的形式

    private void tvClientsAccounts_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
    {
        OpenClientOrAccount(e.Node);
    }

    private void OpenClientOrAccount(TreeNode Node)
    {
        if (Node.Tag is Client)
        {
            frmClients frmC = new frmClients();
            Client Client = (Client)Node.Tag;
            frmC.Id = Client.Id;
            frmC.HouseholdId = Client.Household.Id;
            frmC.MdiParent = Program.frmMain;
            frmC.Show();
        }
        else if (Node.Tag is Account)
        {
            frmAccounts frmA = new frmAccounts();
            Account Account = (Account)Node.Tag;
            frmA.Id = Account.Id;
            frmA.ClientId = Account.Client.Id;
            frmA.MdiParent = Program.frmMain;
            frmA.Show();
        }
    }

这里是设计师的代码定义树状

        // 
        // tvClientsAccounts
        // 
        this.tvClientsAccounts.BackColor = System.Drawing.SystemColors.Control;
        this.tvClientsAccounts.Indent = 15;
        this.tvClientsAccounts.LineColor = System.Drawing.Color.DarkGray;
        this.tvClientsAccounts.Location = new System.Drawing.Point(228, 193);
        this.tvClientsAccounts.Name = "tvClientsAccounts";
        this.tvClientsAccounts.Nodes.AddRange(new System.Windows.Forms.TreeNode[] {
        treeNode9});
        this.tvClientsAccounts.PathSeparator = "";
        this.tvClientsAccounts.ShowNodeToolTips = true;
        this.tvClientsAccounts.Size = new System.Drawing.Size(411, 213);
        this.tvClientsAccounts.TabIndex = 23;
        this.tvClientsAccounts.BeforeExpand += new System.Windows.Forms.TreeViewCancelEventHandler(this.tvClientsAccounts_BeforeExpand);
        this.tvClientsAccounts.AfterExpand += new System.Windows.Forms.TreeViewEventHandler(this.tvClientsAccounts_AfterExpand);
        this.tvClientsAccounts.BeforeSelect += new System.Windows.Forms.TreeViewCancelEventHandler(this.tvClientsAccounts_BeforeSelect);
        this.tvClientsAccounts.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.tvClientsAccounts_AfterSelect);
        this.tvClientsAccounts.NodeMouseClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.tvClientsAccounts_NodeMouseClick);

感谢您的帮助拉斯

Answer 1:

是的,TreeView的是有点这种方式,它的重点恢复对自身的痛苦。 这就是为什么它有AfterXxx事件,但没有AfterNodeMouseClick事件。 解决它的方法是延迟执行该方法中,所有事件的副作用完成之后直到。 这是优雅的使用Control.BeginInvoke()方法来实现,当UI线程再次进入空闲状态及其委托的目标运行。 像这样:

  private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) {
      this.BeginInvoke(new Action(() => OpenClientOrAccount(e.Node)));
  }


文章来源: Click on treeview node open a new MDI form, focus left on first form