2011-01-15 19 views
1

コントロールノードでツリーノードのテキストの外側をクリックするたびに、ノードのクリックイベントが発生しますが、ノードは強調表示されません。なぜこれが起こっているのか分かりません。C#でのTreeNode選択の問題

ノードをクリックしたときにノードを選択したいのですが、ノードをクリックするとテキストが表示されます。空白ではない - ノードの幅がTreenode全体に及ぶと仮定しますか?私はdock.fillモードでそれが何かを持っている場合Treeviewを持って - 私はすべてを試みたが、正しく動作するように取得することはできません。

多分、誰かが何が起こっているか知っているでしょう。

更新: if (e.Location.IsEmpty) {

がbetter-動作するようですが、まだ何もテキストベースのノードの幅は、それが思わ全体のツリービューを横切って延び明らかに存在しない空白の場所でノードを選択?

私がしたいことを達成するためのより良い方法はありますか?それとも最善の方法ですか?

更新:以前のアイデアはうまく機能していません。私はそれをしたと思ったが、それはしなかった。

新しい問題:ツリービューから切り替えると、問題の一部がフォーカスに関連していると思います。

UPDATE-

私はbeforeSelectイベントでノードを選択し、マウスの右クリックを無効にすることについて思い付いただけのコードでは、

if (MouseButtons == System.Windows.Forms.MouseButtons.Right) 
      { 
       e.Cancel = true; 

      } 

ですが、それは任意のヘルプはappreciated-の提案に従っているワーク・ませんでした詳細については、唯一の答えです。

+0

私が覚えている限り、選択されていることをチェックして、nullの場合はイベントハンドラから返すことができます。 – Elalfer

+0

[c# - NodeMouseClickの問題点](http://stackoverflow.com/questions/1190751/c-problem -nodemouseclickと一緒に) - 私はこれの答えがあなたの問題を解決すると思います。 – adrianbanks

+1

NodeMouseClickイベントは、* very * earlyを起動し、コードに意味のある何かを行うチャンスを与えます。組み込まれているものの1つは「テキストがクリックされたときにのみ意味があります」です。ほとんどの場合、AfterSelectイベントが最後に発生します。 –

答えて

3

ノードのどの部分がクリックされたかを判別するには、treeView.HitTestメソッドを使用する必要があります。

private bool IsClickOnText(TreeView treeView, TreeNode node, Point location) 
{ 
    var hitTest = treeView1.HitTest(location); 

    return hitTest.Node == node 
     && hitTest.Location == TreeViewHitTestLocations.Label; 
} 

private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) 
{ 
    if(IsClickOnText(treeView1, e.Node, e.Location)) 
    { 
     MessageBox.Show("click"); 
    } 
} 

private void treeView1_BeforeSelect(object sender, TreeViewCancelEventArgs e) 
{ 
    if (e.Action == TreeViewAction.ByMouse) 
    { 
     var position = treeView1.PointToClient(Cursor.Position);   
     e.Cancel = !IsClickOnText(treeView1, e.Node, position); 
    } 
} 
+0

私のFullRowSelectプロパティはfalseですが、これは私が最初に考えたものです。 – user455046

+0

WinFormsなどを使用していますか? –

+0

私はWinForms TreeViewを使用しており、FullRowSelectではプロパティがfalseであることを示しています。 – user455046

0

.ClickSelectイベントおよび/または.BeforeSelectイベントを使用して、.Clickイベントの代わりに選択処理を処理します。次に、テキストをクリックしたときにのみノードが選択され、空白をクリックすると.AfterSelectまたは.BeforeSelectが発生しません。

+0

私はそれを試してみます - BeforeSelectをチェックしました - あなたは選択イベントをキャンセルするか、AfterSelectを通してチェックしますか? EventArgsにはキャンセルプロパティはありませんか? – user455046