2016-09-14 2 views
1

WindowsフォームでTreeviewを使用していますが、問題が発生しています。展開と折りたたみに関する私のノードの選択はツリービューの一番下で変わります。私はafterselectとMosueDownイベントを使用しています。私の問題は、右のコンテキストメニューも使用しているので、私はAfterSelectとMouseDownの両方のイベントをアプリケーションで処理しなければならないことです。以下は私が使用しようとしているサンプルコードです。この問題を解決する方法やアドバイスはありますか?上記のPICでWinform C#:展開と折りたたみに関するノードの選択がツリービューの下部で変更される

private void trView_MouseDown(object sender, MouseEventArgs e) 
{ 
     if (e.Button == MouseButtons.Right) 
     { 
      trView.SelectedNode = trView.GetNodeAt(e.X, e.Y); 
     } 
     //trView.SelectedNode.EnsureVisible(); //tried this as well 

     trView.SelectedNode.Toggle(); // on this toggle selection changes butonly at the bottom (more specifically for last 3 nodes) 
} 

private void trView_AfterSelect(object sender, TreeViewEventArgs e) 
{ 
    // Code to add child nodes to a selection. 
} 

enter image description here

私はプロジェクトを超えてノードを選択していたときに、UATデータが選択されます。これは最後の3つのノードでのみ起こります。ハマった。助けてください。あなたはこれらのオプションのいずれかを使用することができます

+0

Toggle()呼び出しは非常に悪いランダマイザです。左クリックの動作が非常に悪くなります。 MouseDownでは、ノードはまだ選択されていないので、完全に間違ったノードが展開されます。それを削除し、AfterSelectイベントハンドラがExpand()を呼び出すようにします。 –

+0

あなたは 'if(e.Button == MouseButtons.Right)'をチェックしているので、 '+/-'には何の問題もありません。その基準がない場合は、 'TreeView.HitTest'を使用し、マウスが' +/- 'になっているかどうかをチェックして、標準の振る舞いをトグルして実行させないでください。 –

+0

Afterslectで展開すると別の問題が発生し、避けるためにmousedownで.Toggle()を使い始めました。トグルは、最後の3つのノードを除くすべてのノードで機能します。 –

答えて

1

  1. 使用MouseDownイベント、およびSelectedNodeを設定した後、ToggleそれはBeginInvokeを使用して:

    private void treeView1_MouseDown(object sender, MouseEventArgs e) 
    { 
        if (e.Button == MouseButtons.Right) 
        { 
         treeView1.SelectedNode = treeView1.GetNodeAt(e.X, e.Y); 
         treeView1.BeginInvoke(new Action(() => { treeView1.SelectedNode.Toggle(); })); 
        } 
    } 
    
  2. 使用NodeMouseClickイベント:

    private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) 
    { 
        if (e.Button == MouseButtons.Right) 
        { 
         treeView1.SelectedNode = treeView1.GetNodeAt(e.X, e.Y); 
         treeView1.SelectedNode.Toggle(); 
        } 
    } 
    
012選択は +/-をクリックするとは異なる操作であるため、一般的なパフォーマンスのトグルで

+/-をクリックした後に行う必要があります。しかし、マウスダウンの要件を満たすために、var node = treeView1.GetNodeAt(e.X, e.Y)var hti = treeView1.HitTest(e.Location);e.Buttonに基づくいくつかの基準を単純に混合することができます。

たとえば、以下のコードでは、左クリックと右クリックが同じ方法で動作し、どちらもノードを選択し、選択したノードを切り替える。

private void treeView1_MouseDown(object sender, MouseEventArgs e) 
{ 
    var node = treeView1.GetNodeAt(e.X, e.Y); 
    var hti = treeView1.HitTest(e.Location); 
    if (node == null) 
     return; 
    treeView1.BeginInvoke(new Action(() => treeView1.SelectedNode = node)); 
    if (e.Button == System.Windows.Forms.MouseButtons.Right) 
    { 
     node.Toggle(); 
    } 
    else if (e.Button == System.Windows.Forms.MouseButtons.Left) 
    { 
     if (hti.Location != TreeViewHitTestLocations.PlusMinus) 
      node.Toggle(); 
    } 
} 
+0

お返事ありがとうございます。私は両方のソリューションを試しました。最初は1つの問題で動作します。実際には最初の子ノードが選択され、元のクリックされたノードが選択されます。問題は私の最後の子ノードです。最後のノードが選択されるたびに、ツリービューの右側のリストビューにいくつかのファイルのリストが表示されます。だから私は最後の子ノードの上に1つのノードをクリックします。リストビューが表示されます。 2番目のソリューションでは、+アイコンをクリックしてもノードは展開されません。これを解決するためのアドバイスはありますか? –

+0

'if(e.Button == MouseButtons.Right) 'という条件を使うときは、' +/- 'の問題はありません。また、['HitTest'](https://msdn.microsoft.com/en-us/library/system.windows.forms)の結果を確認して、マウスがダウンしているかどうかを' +/- 'でチェックすることもできます。 treeview.hittest(v = vs.110).aspx)メソッドを使用しています。 –

+0

if(e.Button == MouseButtons.Right)を使用しているときノードのテキストを直接クリックせずに、+ - Iconをクリックしてノードを展開または折りたたむことができます。解決策は、私が展開または崩壊する一方通行にしかならない場合に機能します。どちらかを使用するか、ノードを直接クリックしますが、両方を使用することはできません。 –

関連する問題