2011-01-30 13 views
0

私はフォルダのリストを表示するためにツリービューを持っているWindowsフォームアプリケーションを使っています。私はNodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)イベントを添付しています。 ノードのクリックでサーバーメソッドを呼び出してツリービューにデータを設定します。 ここで、ツリーノードのNodeMouseClickがまったくトリガーされていないことがわかりました。 しかし、ノードの残りの部分は問題なく動作します。誰もそれが引き起こされない正確な理由は何かを教えてくれますか? と私はAfter_Selectイベントを使用したくありません。NodeMouseClickイベントが発生しないようにする要因は何ですか?

public Form1() 
    { 
     InitializeComponent(); 
     Init(); 
    } 

    private void Init() 
    { 
     treeView1.Nodes.Add("root"); 

     for (int i = 0; i < 23; i++) 
     { 
      treeView1.Nodes[0].Nodes.Add(i.ToString()); 
      treeView1.Nodes[0].Nodes[i].Nodes.Add("child" + i.ToString()); 
     } 

     treeView1.Nodes[0].Expand(); 
    } 

サイズ= 280369

+1

私はお手伝いしたいと思っていますが、あなたの問題はコードを投稿することなく完全に再現できません。 'NodeMouseClick'イベントは毎回*私のために働くので、間違ったことをする必要があります。あなたのコードを投稿すると、それが何であるかを考え出します。 –

+0

...どのノードが選択されていないのですか?あなたが説明したように*私はちょうど*テストプロジェクトをセットアップして、側にあるラベルに 'e.Node.Text'を表示する' NodeMouseClick'イベントハンドラを接続しました。ノードのテキストそのものではなく、ノードの横にある+/-ボックスをクリックしても、クリックしたすべてのノードで正しく動作します。私はそれを*仕事ではないように思えます。毎回クリックイベントが失敗する特定のノードはありますか?おおよその位置? –

+0

はいtreeviewの「最後のノード」 - NodeMouseClickにブレークポイントを置いて最後のノードのプラス記号をクリックします。あなたはそれが決して打撃を受けないことを見ることができます。 http://connect.microsoft.com/VisualStudio/feedback/details/266215/treeview-nodemouseclick-event-sometimes-is-not-fired – user595581

答えて

0

の使用ツリービューは、任意のノードを選択した後にトリガされなければならないAfterSelectイベントを使用するようにしてください。

1

コメントで前述したように、回避策はWindows APIのレベルにドロップし、マウスメッセージを傍受し、ノードクリックイベントを自分で発生させることです。コードは醜いですが機能的です。

は(私はCustomTreeViewそれを呼ばれる)プロジェクトで新しいクラスに次のコードを追加します

class CustomTreeView : System.Windows.Forms.TreeView 
{ 
    public event EventHandler<TreeNodeMouseClickEventArgs> CustomNodeClick; 

    private const int WM_LBUTTONDOWN = 0x201; 

    protected override void WndProc(ref System.Windows.Forms.Message m) 
    { 
     if (m.Msg == WM_LBUTTONDOWN) // left mouse button down 
     { 
      // get the current position of the mouse pointer 
      Point mousePos = Control.MousePosition; 

      // get the node the user clicked on 
      TreeNode testNode = GetNodeAt(PointToClient(mousePos)); 

      // see if the clicked area contained an actual node 
      if (testNode != null) 
      { 
       // A node was clicked, so raise our custom event 
       var e = new TreeNodeMouseClickEventArgs(testNode, 
           MouseButtons.Left, 1, mousePos.X, mousePos.Y); 
       if (CustomNodeClick != null) 
        CustomNodeClick(this, e); 
      } 
     } 

     // call through to let the base class process the message 
     base.WndProc(ref m); 
    } 
} 

次に、作成したばかりの新しいCustomTreeViewクラスにあなたのコード内でSystem.Windows.Forms.TreeViewコントロールへの参照をすべて変更します。代わりに使用する既存のTreeViewコントロールのサブクラスです。サブクラス化に慣れていない場合は、既存のコントロールを変更するか、既存のコントロールに新しい機能を追加する方法です。この場合、オリジナルのTreeViewコントロールをサブクラス化して、ノードがユーザによってクリックされたことを検出するたびに、自分自身を上げることになるCustomNodeClickイベントを追加します。

最後に、以前に使用しようとしていたNodeMouseClickイベントの代わりに、フォームクラスのイベントハンドラメソッドを変更して、発生しているCustomNodeClickイベントを待ち受けます。

コンパイルして実行します。すべてが期待どおりに動作するはずです。

関連する問題