2016-03-29 13 views
1

WinForms TreeViewのチェックされていないノードをダブルクリックすると、視覚的にチェックが行われてからチェックが外されます。次のイベントハンドラによって検出されるようにWinForms TreeView紛失イベントのチェック

しかし一つだけAfterCheckイベントが起動されます:

private void treeView1_AfterCheck(object sender, TreeViewEventArgs e) 
{ 
    System.Diagnostics.Debug.WriteLine("{0} {1}: {2}", e.Node.Checked, e.Node, e.Action); 
} 

e.Node.Checkedは、GUIで視覚的な表現がオフになっているにもかかわらずtrueです。

このチェックボックスを再度クリックすると、Node.Checkedのイベントがfalseになり、AfterCheckイベントが発生します。チェックボックスはGUIではチェックされません。

チェックノードをダブルクリックする場合は、逆の場合もあります。

Visual Studio 2010で.NET 4.0用にコンパイルしていて、.NET 4.5.1で実行しています。

これを回避する方法はありますか?

+0

私は他の人の後にWriteLineメソッドにe.Node.Checkedを追加しました。もっと元気に編集されました。 – Matt

+0

ツリービューのチェックボックスをダブルクリックすると、チェック後のイベントで問題が発生するだけでなく、次のマウスがダウンすると問題が発生し、ツリービュー自体をクリックすると次のマウスクリックが失われます。 問題はWindows XPには存在しませんが、7および8.1に存在することが確認できます。 –

+0

@HansPassantの古い投稿でも言及されています。* Windows版ネイティブコントロールのVista版は、TreeViewラッパーにバグを引き起こしました。ラッパーが検出してBeforeCheckイベントとAfterCheckイベントを発生させるための通知メッセージを生成せずに、アイテムを自動的にチェックします。 –

答えて

1

ツリービューのチェックボックスをダブルクリックすると、チェック後のイベントで問題が発生するだけでなく、次のマウスがダウンすると問題が発生し、ツリービュー自体をクリックすると次のマウスがクリックされます失われた

また、Hans Passantの古い投稿にも記載されています。Windows版ネイティブコントロールのVista版では、TreeViewラッパーにバグが発生しました。ラッパーが検出してBeforeCheckおよびAfterCheckイベントを発生させるための通知メッセージを生成せずに、アイテムを自動的にチェックします。

問題はWindows XPには存在しませんが、7および8.1に存在することを確認できます。この問題を解決するために

、あなたはそれがWM_LBUTTONDBLCLKメッセージをhanldeをダブルクリックし、チェックボックスの上にあるかどうかを確認、無視することができます

public class ExTreeView : TreeView 
{ 
    private const int WM_LBUTTONDBLCLK = 0x0203; 
    protected override void WndProc(ref Message m) 
    { 
     if (m.Msg == WM_LBUTTONDBLCLK) 
     { 
      var info = this.HitTest(PointToClient(Cursor.Position)); 
      if (info.Location == TreeViewHitTestLocations.StateImage) 
      { 
       m.Result = IntPtr.Zero; 
       return; 
      } 
     } 
     base.WndProc(ref m); 
    } 
} 
関連する問題