2011-09-05 38 views
5

Tôi đang sử dụng treeview với ba cấp độ nút, cấp độ thứ hai mà tôi đã đặt không có hộp kiểm sử dụng mã trong this question.TreeNode.Handle không quay trở lại bằng Treeview

Nó hoạt động rất tốt, ngoại trừ hộp kiểm đầu tiên nó gặp bao giờ có hộp kiểm loại bỏ:

Example of error

Tôi gọi phương thức với mã này đó là sau khi tất cả các dữ liệu có HideCheckBox() được nạp vào treeview:

foreach (TreeNode appNode in trvPermissions.Nodes) 
{ 
     foreach (TreeNode secNode in appNode.Nodes) 
     { 
     HideCheckBox(trvPermissions, secNode); 
     } 
} 

khi tôi bước qua đoạn code có vẻ như node.Handle trả về 0 cho nút đầu tiên nó gặp và đây không phải là một xử lý hợp lệ để sử dụng khi gọi mã để loại bỏ các kiểm tra cái hộp. Oddly đủ, nếu tôi gọi phương pháp để loại bỏ các hộp kiểm hai lần sau đó xử lý được trả lại đúng.

Có ai có thể đề xuất tại sao TreeNode.Handle không trả lại giá trị chính xác không?

EDIT:

Dưới đây là các mã như yêu cầu -

private const int TVIF_STATE = 0x8; 
    private const int TVIS_STATEIMAGEMASK = 0xF000; 
    private const int TV_FIRST = 0x1100; 
    private const int TVM_SETITEM = TV_FIRST + 63; 

    [StructLayout(LayoutKind.Sequential, Pack = 8, CharSet = CharSet.Auto)] 
    private 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; 
    } 

    [DllImport("user32.dll", CharSet = CharSet.Auto)] 
    private static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, 
              ref TVITEM lParam); 

    /// <summary> 
    /// Hides the checkbox for the specified node on a TreeView control. 
    /// </summary> 
    private void HideCheckBox(TreeView tvw, TreeNode node) 
    { 
     TVITEM tvi = new TVITEM(); 
     tvi.hItem = node.Handle; 
     tvi.mask = TVIF_STATE; 
     tvi.stateMask = TVIS_STATEIMAGEMASK; 
     tvi.state = 0; 
     SendMessage(tvw.Handle, TVM_SETITEM, IntPtr.Zero, ref tvi); 
    } 
+1

bạn có thể hiển thị mã của mình nơi bạn xóa hộp kiểm và gọi nút.Handle không? –

+0

TreeView có hiển thị khi bạn gọi HideCheckBox() không? Tôi có nghĩa là TreeView.Visible được đặt thành true? –

Trả lời

9

Lý do thật sự là không thể nhìn thấy trong mã của bạn. Điều này sẽ thất bại như mô tả khi bạn gọi mã này từ hàm tạo biểu mẫu. Quá sớm, nó chỉ có thể hoạt động khi cửa sổ TreeView được tạo ra. Không cho đến khi đó TreeNode.Handle nhận được một giá trị. Sử dụng tvw.Handle sẽ kích hoạt việc tạo ra các cửa sổ bản địa xử lý, quá muộn để cung cấp cho node.Handle một giá trị cho nút đầu tiên.

Di chuyển mã tới Trình xử lý sự kiện tải hoặc Ghi đè tải lên.

Các vấn đề liên quan