2011-05-25 30 views
13

पर होने से ट्रीनोड चेक से कैसे बचें, इसलिए मेरे पास सी # विंडोज़ फॉर्म ऐप में ट्री व्यू है। मुझे कुछ नोड्स के लिए "लॉक" होने की आवश्यकता है ताकि पैरामीटर के आधार पर उन्हें चेक (या अनचेक) नहीं किया जा सके।सी #: डबल क्लिक ईवेंट

यह क्या मैं अब कर रहा हूँ है:

private void tv_local_BeforeCheck(object sender, TreeViewCancelEventArgs e) { 
    TNode node = (TNode)e.Node; 
    //if a part node, cancel the action. 
    if (node.Type == "Part") { 
     e.Cancel = true;  
    } 
    //if a locked node, cancel the action 
    if (node.Locked == true) { 
     e.Cancel = true; 
    } 
} 

इस कोड चेकबॉक्स का एक सिंगल क्लिक पर अच्छा काम करता है, लेकिन एक चेकबॉक्स पर उपयोगकर्ता दो बार क्लिक करना, यह अभी भी/unchecks जाँच करता है।

मैं nodeMouseDoubleClick घटना के साथ खेल की कोशिश की है, लेकिन यह does not वास्तव में मदद, के बाद से मैं घटना रद्द नहीं कर सकते ...

वहाँ किसी भी विचार वहाँ बाहर एक नोड पर एक डबल क्लिक करें घटना रोकने का तरीका है ?. .. या फिर कुछ और? धन्यवाद

+0

आप पोस्ट कर सकते हैं अपने डबलक्लिक घटना हैंडलर के लिए कोड? –

+0

मेरे पास वहां कुछ भी लिखा नहीं है। मैं डबल क्लिक पर कुछ भी नहीं करना चाहता ... अगर मैं ई। कैंसल = सच कर सकता हूं, तो यह डबलक्लिक घटना – Toadums

+0

में कोड होगा क्या आप सुनिश्चित हैं कि कोई हैंडलर कहीं और सेट नहीं हो रहे हैं? मैंने अभी एक फार्म पर एक पेड़ दृश्य छोड़ने की कोशिश की है और समस्या को पुन: उत्पन्न नहीं कर सकता (मैं VSTS2008 का उपयोग कर रहा हूं) –

उत्तर

21

यह ट्री व्यू में एक बग है जो मुझे लगता है (http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/9d717ce0-ec6b-4758-a357-6bb55591f956/)। आपको पेड़ दृश्य को उप-वर्गीकृत करने और इसे ठीक करने के लिए डबल-क्लिक संदेश को अक्षम करने की आवश्यकता है। इस तरह:

public class NoClickTree : 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

मैंने पहले इस समाधान को देखा था, लेकिन यह समझ नहीं पाया कि इसे कैसे काम करना है - मुझे एहसास नहीं हुआ कि मुझे एक नई कक्षा बनाना है और वृक्षदृश्य वर्ग का विस्तार करना है। धन्यवाद!! – Toadums

+1

याद रखें कि आपको 'Form1.Designer.cs' फ़ाइल में' NoClickTree' के रूप में अपना वृक्षदृश्य प्रारंभ करना है, जैसा कि 'Form1.cs' में नहीं है, जैसा कि समझाया गया है [http://stackoverflow.com/a/14758596/167720 9) – T30

+0

अच्छा !!! थोड़ी देर के लिए यह बग सिरदर्द रहा है! (कम से कम मेरे लिए) –

0

ट्री नोड क्लास को विस्तारित करने का प्रयास करें और एक बूलियन संपत्ति जोड़ें जो उचित चेकस्टेट को बनाए रखती है। इस तरह, जब कोई नोड को डबल-क्लिक करता है, तो आप नोड की चेक की गई स्थिति को संपत्ति में संग्रहीत मूल्य पर रीसेट कर सकते हैं। एक और अधिक सुरुचिपूर्ण समाधान हो सकता है, लेकिन यह सबसे अच्छा है जिसके बारे में मैं सोच सकता हूं।

1

मैं निम्नलिखित कोड है, जो जाँच जड़ नोड्स से बचाता है के साथ इसे कामयाब रहे:

private void MyTreeView_MouseUp(object sender, MouseEventArgs e) 
{ 
    // HACK: avoid to check root nodes (mr) 
    var node = ((TreeView)sender).GetNodeAt(new Point(e.X, e.Y)); 
    if (node != null && node.Parent == null) 
    BeginInvoke(new MouseEventHandler(TreeView_MouseUpAsync), sender, e); 
} 

private void TreeView_MouseUpAsync(object sender, MouseEventArgs e) 
{ 
    if (IsDisposed) 
     return; 

    var node = ((TreeView)sender).GetNodeAt(new Point(e.X, e.Y)); 
    node.Checked = false; 
} 
4

आप अपने डबल क्लिक करें वास्तव में चेक बॉक्स चालू करने के लिए तो कोशिश करना चाहते हैं:

protected override void WndProc(ref Message m) 
{ 
    // Filter WM_LBUTTONDBLCLK when we're showing check boxes 
    if (m.Msg == 0x203 && CheckBoxes) 
    { 
    // See if we're over the checkbox. If so then we'll handle the toggling of it ourselves. 
    int x = m.LParam.ToInt32() & 0xffff; 
    int y = (m.LParam.ToInt32() >> 16) & 0xffff; 
    TreeViewHitTestInfo hitTestInfo = HitTest(x, y); 

    if (hitTestInfo.Node != null && hitTestInfo.Location == TreeViewHitTestLocations.StateImage) 
    { 
     OnBeforeCheck(new TreeViewCancelEventArgs(hitTestInfo.Node, false, TreeViewAction.ByMouse)); 
     hitTestInfo.Node.Checked = !hitTestInfo.Node.Checked; 
     OnAfterCheck(new TreeViewEventArgs(hitTestInfo.Node, TreeViewAction.ByMouse)); 
     m.Result = IntPtr.Zero; 
     return; 
    } 
    } 

    base.WndProc(ref m); 
} 
+0

मैंने आपका कोड इस्तेमाल किया और ऐसा लगता है कि यह काम करता है। बहुत बहुत धन्यवाद। – DonkeyMaster

+0

पूरी तरह से काम करता है! –

संबंधित मुद्दे