Click on treeview node open a new MDI form, focus left on first form

有些话、适合烂在心里 提交于 2019-12-31 06:25:50

问题


I'm trying to open a new form after clicking a node in a treeview.

In the first MDI form I have a treeview, when I click on a node in the tree view a 2nd MDI form is opened, but the first form keeps the focus. I want the new form to have the focus.

I have noticed the first form's _Enter event is firing as if something is setting focus back to the first form.

There is also a button on the first form that does the same function and it works great. I have a feeling the treeview has some special attribute set to cause the focus to come back to the first form.

Here is the code opening the form

    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();
        }
    }

Here is the designer code defining the treeview

        // 
        // 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);

Thanks for your help Russ


回答1:


Yes, TreeView is a bit of a pain that way, it restores the focus to itself. That's why it has the AfterXxx events, but there's no AfterNodeMouseClick event. The way to solve it is to delay executing the method, until after all event side-effects are completed. That's elegantly done by using the Control.BeginInvoke() method, its delegate target runs when the UI thread goes idle again. Like this:

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


来源:https://stackoverflow.com/questions/12360436/click-on-treeview-node-open-a-new-mdi-form-focus-left-on-first-form

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!