2010-07-20 4 views
1

내 프로젝트는 WinForms, C#입니다.모든 TreeViewItem 하위를 선택 또는 선택 해제하십시오.

True로 설정된 CheckBox가있는 TreeView가있는 폼이 있습니다. 각각 여러 개의 자식 노드가있는 루트 노드가 몇 개 있습니다.

나는 모든 하위 노드가 부모와 동일한 체크/체크되지 않은 상태를 가지길 원합니다. 다음과 같은 이벤트 처리기를 작성했습니다 :

private void treeView1_AfterCheck(object sender, TreeViewEventArgs e) 
{ 
    // return in case the event is induced by the code below 
    if (e.Action == TreeViewAction.Unknown) 
    { 
    return; 
    } 
    System.Diagnostics.Debug.WriteLine(string.Format("Checked - {0}", e.Node.Checked)); 
    foreach (TreeNode subNode in e.Node.Nodes) 
    { 
    subNode.Checked = e.Node.Checked; 
    } 
} 

그러나 부모를 신속하게 클릭하면 매우 이상하게 작동합니다. 부모를 이미 선택하지 않은 상태에서 하위 노드를 모두 확인하도록 신속하게 확인하고 선택을 취소하여 쉽게 재현 할 수 있습니다.

이 작업을 올바르게 수행하는 방법은 무엇입니까?

+0

클릭하면이 이벤트가 빠르게 호출되지 않습니다. System.Diagnostics.Debug.WriteLine (string.Format ("Checked - {0}", e.Node.Checked))을 추가했습니다. 두 번째 (선택 취소) 클릭에 대해서는 "Checked-false"를 볼 수 없습니다. – Alex

+0

두 번 클릭 동작을 무시할 경우에만이 동작을 재현 할 수있었습니다. 그렇지 않으면 클릭하는 노드를 빠르게 확대/축소하면됩니다. – msergeant

+0

msergeant, 항목 텍스트가 아닌 체크 박스를 빠르게 클릭하십시오. 확장되거나 붕괴되어서는 안됩니다. – Alex

답변

3

이것은 네이티브 TreeView 컨트롤의 Vista 버전에서 도입 된 버그입니다. 그것은 자동으로 체크 박스를 토글함으로써 더블 클릭에 응답합니다. 그러나 BeforeCheck 및 AfterCheck 이벤트를 발생시키지 않습니다. 이 문제를 해결하기 위해 Windows Forms TreeView 클래스 래퍼가 업데이트되지 않았습니다.

수정 사항은 간단하므로 네이티브 컨트롤이 두 번 클릭되는 것을 방지해야합니다. 프로젝트에 새 클래스를 추가하고 아래 표시된 코드를 붙여 넣습니다. 엮다. 새 컨트롤을 도구 상자의 위쪽에서 폼으로 끌어다 놓고 기존 트리 뷰를 바꿉니다.

using System; 
using System.Windows.Forms; 

public class MyTreeView : TreeView { 
    protected override void WndProc(ref Message m) { 
    // Suppress WM_LBUTTONDBLCLK 
    if (m.Msg == 0x203) { m.Result = IntPtr.Zero; } 
    else base.WndProc(ref m); 
    } 
} 
+0

고마워, 한스! 이것은 완벽하게 작동합니다. 그러나 더블 클릭을 무시하고 AfterCheck 이벤트를 수동으로 보내면 어떨까요? 너 왜 생각하니? – Alex

+0

그러면 프로그램이 XP에서 제대로 작동하지 않게됩니다. 가능하지만 base.WndProc 호출 후에 항목 검사 상태를 읽어야합니다. P/Invoke는 까다 롭습니다. –

1

클릭하면 시작/재설정되는 타이머가 추가됩니다. 타이머가 500ms 후에 실행되면 실제 업데이트 코드가 실행됩니다.

이렇게하면 빠른 클릭을 서로 수정합니다.

+0

감사합니다. 시도 할 것입니다. 그러나 이것은 두 번째 사건이 통제에 의해 결코 받아 들여지지 않는다는 것을 저를 놀라게합니다! 이것은 프레임 워크 버그 인 것 같습니다. – Alex

+0

코드를 공유해 주시겠습니까? – Alex

0

빠르게 누르면 더블 클릭 이벤트가 한 번의 클릭 대신 실행됩니다. 단일 클릭 동작은 확인 된 상태를 변경합니다. 정상적인 두 번 클릭 동작을 재정의하려면 무언가를 수행 한 후 자식 노드에서 해당 동작을 고려해야합니다.

+0

아니요, 두 번 클릭 이벤트가 발생하지 않을만큼 느리게 클릭합니다. 나는 확실히하기 위해이 사건을 오버라이드한다. – Alex

관련 문제