문제

WinForms 응용 프로그램의 TreeView 컨트롤에서 일부 확인란을 비활성화 할 수 있어야하지만 표준 TreeView 컨트롤에는 이러한 기능이 내장되어 있지 않습니다.

나는 이미 treeview.beforecheck 이벤트를 사용하고 있으며 노드가 비활성화되어 완벽하게 잘 작동하면 취소합니다.

또한 비활성화 된 노드의 예측 olor를 GrayText로 변경합니다.

간단하고 강력한 솔루션이 있습니까?

도움이 되었습니까?

해결책

C ++에 지원이 있으므로 P/Invoke를 사용하여 해결할 수 있습니다.

P/Invoke 부품의 설정은 다음과 같습니다. 호출 클래스에서 사용할 수 있도록하십시오.

    // constants used to hide a checkbox
    public const int TVIF_STATE = 0x8;
    public const int TVIS_STATEIMAGEMASK = 0xF000;
    public const int TV_FIRST = 0x1100;
    public const int TVM_SETITEM = TV_FIRST + 63;

    [DllImport("user32.dll")]
    static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam,
    IntPtr lParam); 

    // struct used to set node properties
    public struct TVITEM
    {
        public int mask;
        public IntPtr hItem;
        public int state;
        public int stateMask;
        [MarshalAs(UnmanagedType.LPTStr)]
        public String lpszText;
        public int cchTextMax;
        public int iImage;
        public int iSelectedImage;
        public int cChildren;
        public IntPtr lParam;

    } 

노드별로 노드를 결정하고 싶습니다. 가장 쉬운 방법은 드로우 노드 이벤트입니다. 이 이벤트를 위해 트리를 소유자로 설정하도록 설정해야하므로 기본 설정 이외의 다른 것으로 설정해야합니다.

this.tree.DrawMode = TreeViewDrawMode.OwnerDrawText;
this.tree.DrawNode += new DrawTreeNodeEventHandler(tree_DrawNode);

트리에서 _drawnode 함수에서 그려진 노드에 확인란이 있어야하는지 여부를 결정하고 호출 할 때 숨기십시오. 그런 다음 다른 모든 세부 사항을 그리는 것에 대해 걱정하고 싶지 않기 때문에 기본 드로우 속성을 true로 설정하십시오.

void tree_DrawNode(object sender, DrawTreeNodeEventArgs e)
{
    if (e.Node.Level == 1)
    {
        HideCheckBox(e.Node);
        e.DrawDefault = true;
    }
    else 
    {
        e.Graphics.DrawString(e.Node.Text, e.Node.TreeView.Font,
           Brushes.Black, e.Node.Bounds.X, e.Node.Bounds.Y);
    }
}

마지막으로, 우리가 정의한 함수에 대한 실제 호출은 다음과 같습니다.

private void HideCheckBox(TreeNode node)
{
    TVITEM tvi = new TVITEM();
    tvi.hItem = node.Handle;
    tvi.mask = TVIF_STATE;
    tvi.stateMask = TVIS_STATEIMAGEMASK;
    tvi.state = 0;
    IntPtr lparam = Marshal.AllocHGlobal(Marshal.SizeOf(tvi));
    Marshal.StructureToPtr(tvi, lparam, false);
    SendMessage(node.TreeView.Handle, TVM_SETITEM, IntPtr.Zero, lparam);
}

다른 팁

TreeView.Beforecheck-이 이벤트에 등록하고, 노드가 확인란을 확인할 수 있는지 여부를 확인하고 확인할 수없는 경우 TreeViewCeleventArgs에서 취소 속성을 설정하여 이벤트를 취소 할 수 있습니다. 이는 사용자가 해당 상자를 점검하지 못하지만 최상의 사용자 경험을 원하지 않기를 바랍니다.

확인할 수없는 항목의 확인란을 제거하려면 소유자 드로우를 사용하여 확인란 위에 단단한 사각형을 그려 제거 할 수 있습니다.

이 작업을 수행 할 내용이 없습니다. BeforeCheck 이벤트를 사용하여 원하는 노드에 대해 취소 할 수 있습니다. 확인란의 등장이 중요한 경우, 확인란을 비활성화하기 위해 이미지를 배치해야합니다.

이것 링크 당신의 관심사 일 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top