2013-02-01 12 views
12

मेरे पास चेकबॉक्स के साथ एक वृक्षदृश्य है, मैं चेकबॉक्स में केवल तभी क्लिक करने की कोशिश कर रहा हूं जब यह चेकबॉक्स में किया जाता है।सी # ट्रीव्यूव केवल चेकबॉक्स पर डबल क्लिक को अनदेखा करें

मुझे डबल क्लिक को पूरी तरह से अक्षम करने का एक तरीका मिला लेकिन यह वही नहीं था जो मैं चाहता था।

यदि आप मेरी मदद कर सकते हैं तो मैं सराहना करता हूं।

उत्तर

4

तुम सिर्फ एक डबलक्लिक घटना जानना चाहते हैं चेकबॉक्स से उत्पन्न हुई:

private void TreeViewDoubleClick(object sender, EventArgs e) 
{ 
    var localPosition = treeView.PointToClient(Cursor.Position); 
    var hitTestInfo = treeView.HitTest(localPosition); 
    if (hitTestInfo.Location == TreeViewHitTestLocations.StateImage) 
     return; 

    // ... Do whatever other processing you want 
} 
+0

यह पूरी तरह से काम करता है। आपको बहुत धन्यवाद। –

+0

मुझे पता था कि मैंने जो जवाब दिया उससे बेहतर तरीका होना चाहिए था, लेकिन इसे समझ नहीं पाया। +1 – TaRDy

+1

मुझे यकीन नहीं है कि यह काम करता है। बग वास्तव में सभी डबल क्लिक घटनाओं को छिपाने लगता है। यदि आप चेकबॉक्स पर डबल क्लिक करते हैं, तो घटनाओं पर दो बार क्लिक न करें। यदि आप फिर कहीं भी कहीं भी क्लिक करते हैं, * फिर * डबल क्लिक इवेंट आग लगती है, लेकिन क्योंकि उन्होंने इतनी देर से निकाल दिया है, वे अपने ईवेंट में गलत जानकारी के साथ समाप्त होते हैं। –

9

विकल्प 1: पूरी तरह से डबल क्लिक करें घटना को अक्षम करें।
एक ग्राहक नियंत्रण

 
class MyTreeView : TreeView 
{ 
    protected override void WndProc(ref Message m) 
    { 
     if (m.Msg == 0x0203) 
     { 
      m.Result = IntPtr.Zero; 
     } 
     else 
     { 
      base.WndProc(ref m); 
     } 
    } 
} 

और अपने डिजाइनर फ़ाइल (form.Designer.cs), जहां नियंत्रण बनाया गया था देखने में बनाएँ, और अपने नए नियंत्रण के साथ TreeView निर्माता करने के लिए कॉल की जगह।

this.treeView1 = new MyTreeView();

विकल्प 2: दो सिंगल क्लिक घटनाओं

 
class MyTreeView : TreeView 
{ 
    protected override void WndProc(ref Message m) 
    { 
     if (m.Msg == 0x0203) 
     { 
      m.Msg = 0x0201; 
     } 
     base.WndProc(ref m); 
    } 
} 

निजी तौर पर मुझे लगता है कि विकल्प 2 अधिक सहज ज्ञान युक्त है के रूप में एक डबल क्लिक करें घटना उपचार करें। जब उपयोगकर्ता दो बार चेक बॉक्स पर क्लिक करता है, तो चेकबॉक्स चेक नहीं किया जाता है।

11

मुझे एक ही बग के लिए googling जब यह सवाल मिला। नूडलफॉक के समाधान के साथ समस्या यह है कि यह किसी आइटम पर डबल क्लिक करके तीनों को विस्तारित करने में अक्षम बनाता है। जॉन arlens जवाब के साथ NoodleFolk के जवाब को संयोजित करके आप कुछ इस तरह मिलेगा:

class NewTreeView : TreeView 
{ 
    protected override void WndProc(ref Message m) 
    { 
     if (m.Msg == 0x203) // identified double click 
     { 
      var localPos = PointToClient(Cursor.Position); 
      var hitTestInfo = HitTest(localPos); 
      if (hitTestInfo.Location == TreeViewHitTestLocations.StateImage) 
       m.Result = IntPtr.Zero; 
      else 
       base.WndProc(ref m); 
     } 
     else base.WndProc(ref m); 
    } 
} 

मैं (जल्दी) इस समाधान का परीक्षण किया, और यह काम करने लगता है।

0

उपरोक्त उत्तरों को जोड़कर, मैंने पाया कि यह मेरे लिए सबसे अच्छा समाधान है। अपने बच्चों का विस्तार करने के लिए नोड पर डबल क्लिक करना अभी भी काम करता है, केवल चेकबॉक्स पर डबल क्लिक करना प्रभावित होता है और तय किया जाता है:

class MyTreeView : TreeView 
{ 
    protected override void WndProc(ref Message m) 
    { 
     if (m.Msg == 0x0203 && this.CheckBoxes) 
     { 
     var localPos = this.PointToClient(Cursor.Position); 
     var hitTestInfo = this.HitTest(localPos); 
     if (hitTestInfo.Location == TreeViewHitTestLocations.StateImage) 
     { 
      m.Msg = 0x0201; 
     } 
     } 
     base.WndProc(ref m); 
    } 
} 
संबंधित मुद्दे