2011-09-05 16 views
5

का उपयोग करके वापस नहीं लौट रहा है मैं नोड्स के तीन स्तरों के साथ एक वृक्षदृश्य का उपयोग कर रहा हूं, दूसरा स्तर जिसे मैंने this question में कोड का उपयोग करके चेकबॉक्स नहीं रखा है।TreeNode.Handle Treeview

Example of error

मैं इस कोड है जो डेटा के सभी है के बाद है साथ HideCheckBox() विधि फोन कर रहा हूँ:

यह बहुत पहले चेकबॉक्स यह कभी नहीं का सामना करना पड़ता छोड़कर बहुत अच्छी तरह से काम करता है चेकबॉक्स हटा दिया गया है

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

जब मैं कोड के माध्यम से कदम ऐसा लगता है कि node.Handle प्रथम नोड यह मुठभेड़ों के लिए रिटर्न 0 और इस जब दूर करने के लिए कोड बुला उपयोग करने के लिए एक वैध संभाल नहीं है: treeview में लोड किया गया चेक डिब्बा। विचित्र रूप से पर्याप्त है, अगर मैं चेकबॉक्स को दो बार हटाने के लिए विधि को कॉल करता हूं तो हैंडल ठीक से वापस कर दिया जाता है।

क्या कोई सुझाव दे सकता है कि क्यों TreeNode.Handle सही मान वापस नहीं करेगा?

संपादित करें:

यहाँ कोड के रूप में अनुरोध है -

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

क्या आप अपना कोड दिखा सकते हैं जहां आप चेकबॉक्स को हटाते हैं और नोड को कॉल करते हैं। हैंडल? –

+0

जब आप HideCheckBox() को कॉल करते हैं तो TreeView दिखाई देता है? मेरा मतलब है TreeView.Visible सच पर सेट है? –

उत्तर

9

सच कारण अपने कोड में दिखाई नहीं देता है। जब आप इस कोड को फॉर्म कन्स्ट्रक्टर से कॉल करते हैं तो यह वर्णन के रूप में विफल हो जाएगा। बहुत जल्दी, यह केवल तब काम कर सकता है जब देशी TreeView विंडो बनाई जाती है। तब तक नहीं जब तक TreeNode.Handle एक मूल्य मिलता है। Tvw.Handle का उपयोग नोड देने के लिए बहुत देर हो चुकी है, मूल खिड़की हैंडल के निर्माण को ट्रिगर करेगा। पहले नोड के लिए एक मूल्य हैडल करें।

कोड को लोड ईवेंट हैंडलर या ऑनलोड ओवरराइड पर ले जाएं।