0

ツリービューでノードをクリックした後、新しいフォームを開こうとしています。

最初の MDI フォームにはツリービューがあり、ツリー ビューのノードをクリックすると、2 番目の 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);

助けてくれてありがとうラス

4

1 に答える 1

2

はい、TreeView は少し面倒です。フォーカスをそれ自体に戻します。そのため、AfterXxx イベントはありますが、AfterNodeMouseClick イベントはありません。これを解決する方法は、すべてのイベントの副作用が完了するまで、メソッドの実行を遅らせることです。これは、Control.BeginInvoke() メソッドを使用してエレガントに行われます。そのデリゲート ターゲットは、UI スレッドが再びアイドル状態になると実行されます。このような:

  private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) {
      this.BeginInvoke(new Action(() => OpenClientOrAccount(e.Node)));
  }
于 2012-09-11T00:25:23.287 に答える