2013-02-01 58 views
12

ツリービューを持つチェックボックスがあります。このチェックボックスがオンの場合のみダブルクリックを無効にしようとしています。c#treeviewチェックボックスでのみダブルクリックを無視する

ダブルクリックを完全に無効にする方法が見つかりましたが、私が望んでいたものではありませんでした。

私がお手伝いできることを感謝します。

答えて

4

あなただけのDoubleClickイベントをお知りになりたい場合は、チェックボックスから発生しました:

private void TreeViewDoubleClick(object sender, EventArgs e) 
{ 
    var localPosition = treeView.PointToClient(Cursor.Position); 
    var hitTestInfo = treeView.HitTest(localPosition); 
    if (hitTestInfo.Location == TreeViewHitTestLocations.StateImage) 
     return; 

    // ... Do whatever other processing you want 
} 
+0

これは完全に機能しました。本当にありがとうございます。 –

+0

私は答えたよりも良い方法がなければならないと知っていましたが、それを理解できませんでした。 +1 – TaRDy

+1

これはわかりません。このバグは、実際にはダブルクリックのすべてのイベントを詰まらせるようです。チェックボックスをダブルクリックすると、ダブルクリックイベントが発生しません。もしあなたがどこかでシングルクリックするとダブルクリックイベントが発生しますが、遅れてしまったので、彼らはそのイベントの間違った情報で終わります。 –

9

オプション1:完全にダブルクリックイベントを無効にします。
は、顧客管理

 
class MyTreeView : TreeView 
{ 
    protected override void WndProc(ref Message m) 
    { 
     if (m.Msg == 0x0203) 
     { 
      m.Result = IntPtr.Zero; 
     } 
     else 
     { 
      base.WndProc(ref m); 
     } 
    } 
} 

とあなたのデザイナーのファイルに(form.Designer.cs)を作成しますコントロールが作成された場所を探して、あなたの新しいコントロールとTreeViewコントロールのコンストラクタの呼び出しを置き換えます。

this.treeView1 = new MyTreeView();

オプション2:2つのクリックイベント

 
class MyTreeView : TreeView 
{ 
    protected override void WndProc(ref Message m) 
    { 
     if (m.Msg == 0x0203) 
     { 
      m.Msg = 0x0201; 
     } 
     base.WndProc(ref m); 
    } 
} 

個人的に私は、オプション2がより直感的だと思うようダブルクリックイベントを扱います。ユーザーがチェックボックスを2回クリックすると、チェックボックスはオンになりません。

11

私は同じバグのためにグーグルでこの質問を見つけました。 NoodleFolkの解決策の問題は、アイテムをダブルクリックすることで3つの拡張を無効にすることです。ジョンarlens答えとNoodleFolkの答えを組み合わせることで、あなたはこのようなものになるだろう:

class NewTreeView : TreeView 
{ 
    protected override void WndProc(ref Message m) 
    { 
     if (m.Msg == 0x203) // identified double click 
     { 
      var localPos = PointToClient(Cursor.Position); 
      var hitTestInfo = HitTest(localPos); 
      if (hitTestInfo.Location == TreeViewHitTestLocations.StateImage) 
       m.Result = IntPtr.Zero; 
      else 
       base.WndProc(ref m); 
     } 
     else base.WndProc(ref m); 
    } 
} 

を私は(すぐに)このソリューションをテストし、動作しているようです。

0

上記の回答を組み合わせると、これが私にとって最善の解決策であることがわかりました。ノードをダブルクリックして子を展開しても、チェックボックスをダブルクリックするだけで問題は解決され、修正されます。

class MyTreeView : TreeView 
{ 
    protected override void WndProc(ref Message m) 
    { 
     if (m.Msg == 0x0203 && this.CheckBoxes) 
     { 
     var localPos = this.PointToClient(Cursor.Position); 
     var hitTestInfo = this.HitTest(localPos); 
     if (hitTestInfo.Location == TreeViewHitTestLocations.StateImage) 
     { 
      m.Msg = 0x0201; 
     } 
     } 
     base.WndProc(ref m); 
    } 
} 
関連する問題