2010-02-04 11 views
15

नोड को ट्रीव्यू में ऊपर और नीचे ले जाने का सबसे सटीक तरीका क्या है। मुझे प्रत्येक नोड पर एक संदर्भ मेनू मिला और चयनित नोड को इसके सभी उपन्यासों के साथ स्थानांतरित किया जाना चाहिए।ट्री अप या डाउन

मैं उपयोग कर रहा हूँ सी # नेट 3.5 WinForms

+0

आप स्पष्ट कर सकते हैं, WinForms या WebForms :) –

+0

लानत, खेद भूल गया - WinForms – Kai

+0

थोड़ा और विस्तार दें: आप मानक WinForms TreeView का उपयोग कर रहे हैं? क्या आपने ऐसा करने के लिए ड्रैग-एंड-ड्रॉप माना है? : एमएसडीएन, कोडप्रोजेक्ट इत्यादि पर इसे कैसे करें इसके कई उदाहरणइस मामले पर विचार करें: आपके पास नोड "1 ए" है जिसमें बाल नोड्स हैं: यह नोड "1" का पहला बच्चा नोड है: आप अपने संदर्भ मेनू (?) के माध्यम से, नोड "1 ए" को ऊपर ले जाने के लिए चुनते हैं: क्या होना चाहिए : कुछ भी तो नहीं ? नोड "1 ए" नोड "1" का "भाई" बनना चाहिए? यदि नोड "1 ए" नोड "1" का "भाई" बन जाता है: क्या इसे TreeView में नोड "1" के ऊपर या नीचे रखा जाना चाहिए? – BillW

उत्तर

34

आप नीचे दिए गए एक्सटेंशन का उपयोग कर सकते हैं:

public static class Extensions 
{ 
    public static void MoveUp(this TreeNode node) 
    { 
     TreeNode parent = node.Parent; 
     TreeView view = node.TreeView; 
     if (parent != null) 
     { 
      int index = parent.Nodes.IndexOf(node); 
      if (index > 0) 
      { 
       parent.Nodes.RemoveAt(index); 
       parent.Nodes.Insert(index - 1, node); 
      } 
     } 
     else if (node.TreeView.Nodes.Contains(node)) //root node 
     { 
      int index = view.Nodes.IndexOf(node); 
      if (index > 0) 
      { 
       view.Nodes.RemoveAt(index); 
       view.Nodes.Insert(index - 1, node); 
      } 
     } 
    } 

    public static void MoveDown(this TreeNode node) 
    { 
     TreeNode parent = node.Parent; 
     TreeView view = node.TreeView; 
     if (parent != null) 
     { 
      int index = parent.Nodes.IndexOf(node); 
      if (index < parent.Nodes.Count -1) 
      { 
       parent.Nodes.RemoveAt(index); 
       parent.Nodes.Insert(index + 1, node); 
      } 
     } 
     else if (view != null && view.Nodes.Contains(node)) //root node 
     { 
      int index = view.Nodes.IndexOf(node); 
      if (index < view.Nodes.Count - 1) 
      { 
       view.Nodes.RemoveAt(index); 
       view.Nodes.Insert(index + 1, node); 
      } 
     } 
    } 
} 

बाल नोड्स अपने माता पिता का पालन करेंगे।

संपादित करें: जोड़ा गया मामला जो नोड को स्थानांतरित करने के लिए TreeView में एक रूट है।

+0

भाई डायनेमी, मुझे खुशी है कि आपने कम से कम एक चीज ली जो मैंने गंभीरता से कहा :) सर्वोत्तम, – BillW

+1

सर्वोत्तम परिणामों के लिए, 'view.BeginUpdate() ',' view.EndUpdate() 'और' node.TreeView.SelectedNode = node जोड़ें '। –

+2

int अनुक्रमणिका = parent.Nodes.IndexOf (नोड); इसे 'int index = node.Index;' के साथ प्रतिस्थापित किया जा सकता है – David

8

जबकि मुझे लगता है कि यह कोड लिखने का समय है, ओपी द्वारा टिप्पणियों के जवाब की कमी के कारण, कम से कम मैं यह कर सकता हूं कि ले-सावार्ड द्वारा कोड उदाहरण कैसे तय किया जा सकता है ताकि बहु क्लिक संदर्भ मेनू पर ऊपर या नीचे विकल्प ... मानते हैं कि संदर्भ मेनू प्रत्येक बार स्वत: बंद नहीं होता है और उपयोगकर्ता को एक ही नोड को बार-बार चुनने के लिए मजबूर किया जाता है ... ऑरगिनली चयनित नोड के साथ सही काम करेगा यह सुधार

public static class Extensions 
{ 
    public static void MoveUp(this TreeNode node) 
    { 
     TreeNode parent = node.Parent; 
     if (parent != null) 
     { 
      int index = parent.Nodes.IndexOf(node); 
      if (index > 0) 
      { 
       parent.Nodes.RemoveAt(index); 
       parent.Nodes.Insert(index - 1, node); 

       // bw : add this line to restore the originally selected node as selected 
       node.TreeView.SelectedNode = node; 
      } 
     } 
    } 

    public static void MoveDown(this TreeNode node) 
    { 
     TreeNode parent = node.Parent; 
     if (parent != null) 
     { 
      int index = parent.Nodes.IndexOf(node); 
      if (index < parent.Nodes.Count - 1) 
      { 
       parent.Nodes.RemoveAt(index); 
       parent.Nodes.Insert(index + 1, node); 

       // bw : add this line to restore the originally selected node as selected 
       node.TreeView.SelectedNode = node; 
      } 
     } 
    } 
} 
बेशक

, अभी भी तथ्य यह है कि उदाहरण के कोड में जो एक से अधिक जड़ नोड्स हटाया नहीं जा सकता को संबोधित नहीं करता (क्योंकि वे 'parentless हैं)::, और नहीं अन-इरादा दुष्प्रभाव बनाने कि easiliy है सुधारी जा सकने वाली।

न ही यह एक और अधिक दिलचस्प मामला संबोधित करता है जहां एक शीर्ष बाल-नोड को स्थानांतरित करना है, इसका मतलब है कि आप "प्रचारित" बाल कोड कहां जाना चाहिए: बिल्कुल वही "रणनीतिक पसंद" शामिल है जहां आप "नीचे उतरते हैं" "माता-पिता नोड का अंतिम बच्चा नोड और इस प्रकार यह तय करना आवश्यक है कि इसे कहां जाना चाहिए। डायनेमी ले-सावार्ड के कोड में: इन मामलों को अभी अनदेखा कर दिया गया है। एक डिजाइन पसंद है कि एक समाधान के लिए पूरी तरह से उपयुक्त हो सकता है:

हालांकि, यह से केवल अपने मूल नोड्स के भीतर ले जाया जा रहा एक डिजाइन पसंद चाइल्ड नोड प्रतिबंधित करने के लिए है संग्रह नोड्स।

इसी तरह, यह एक डिजाइन पसंद एक नोड और चुनने के लिए उपयोगकर्ता के लिए मजबूर करने के लिए है एक संदर्भ मेनू कि नीचे हर बार ऊपर जा रहा है या के एक विकल्प है कि वे इसे ले जाना चाहते हैं अनुमति देता है प्राप्त करने के लिए संदर्भ-क्लिक करें : यह एक डिज़ाइन विकल्प नहीं है जो मैं करूँगा: मैं यहां ड्रैग-एंड-ड्रॉप का उपयोग कर रहा हूं या बटन जो पेड़ में कहीं भी किसी भी चयनित नोड के दोबारा तेजी से आग स्थानांतरण की अनुमति देता है।

जिस तरह से मुझे डायनेमी ले-सावार्ड के एक्सटेंशन का उपयोग पसंद है।

+0

एचएम, दिलचस्प। आप ओपी की अस्पष्ट 2 पंक्तियों की पंक्तियों से कटौती करने में कामयाब रहे, कि: 1- संदर्भ मेनू वास्तव में मूवअप() और मूवडाउन() कार्यक्षमताओं वाली चीज है; 2- अनुरोध वास्तव में उनके भाई बहनों के बजाय, उनके इंडेंटेशन स्तरों के माध्यम से नोड्स को स्थानांतरित करना था; 3- सॉफ्टवेयर उपयोगकर्ता वास्तव में अंडरलेइंग, स्वचालित कार्रवाई होने की बजाय, नोड्स को ऊपर और नीचे ले जाने की क्रिया कर रहा था। मेरा मतलब है कि उस बिंदु पर, वहां क्यों रुकें, चलो चमकदार द्रव संक्रमण जोड़ें जो नोड को आसानी से स्थिति में ले जाता है, यहां तक ​​कि कुछ फ्लिप और सुंदर चमकदार स्पार्क भी जोड़ सकते हैं। –

+0

भाई डायनेमी, हम दोनों "मानसिक शक्तियों का उपयोग कर रहे हैं", ओपी द्वारा उनके इरादे के बारे में उचित प्रश्नों के उत्तर की कमी के कारण :) मैं क्षमा चाहता हूं अगर मैंने ऊपर जो भी कहा है, वह आपके उत्तर की आलोचना करता है। तथ्य यह है कि एक बार घुमावदार नोड अपने भाई के आदेश के शीर्ष पर पहुंचने के बाद आपके जवाब का विचित्र दुष्प्रभाव होगा, और "आगे बढ़ना" दोहराया जाता है। यदि आपने प्रकाशित कोड में इस तरह के व्यवहार की ओर इशारा किया, या सही किया, तो मैं खुश रहूंगा, और आपको वोट दूंगा :) जैसा कि मैंने कहा था, मुझे पसंद है कि आपने विस्तार विधियों का उपयोग यहां किया है! और मैंने आपकी प्रतिक्रिया के "प्रेषण" में काव्य रचनात्मकता का आनंद लिया! – BillW

+0

1. संदर्भ मेनू के माध्यम से नोड के एक चाल-स्थान या स्थानांतरित करने का चयन करना एकमात्र उचित धारणा है जिसे आप यहां कर सकते हैं: बेशक यह "अंतर्निहित" कोड को ट्रिगर करेगा (जहां यह "झूठ" होगा?) । 2. मैंने इंडेंटेशन स्तरों के माध्यम से नोड को स्थानांतरित करने के बारे में कुछ भी नहीं माना: मैंने अभी सवाल उठाया है कि ओपी को यह पता लगाने के लिए कि वे क्या कर रहे थे, स्पष्ट बयान देने के लिए: मैंने मुद्दा उठाया: मैंने यह नहीं कहा कि यह मुद्दा होना चाहिए था addresed। 3. एक संदर्भ मेनू विकल्प के साथ कौन सा अंतिम उपयोगकर्ता नोड ऊपर या नीचे स्थानांतरित करने का विकल्प बना रहा होगा: ओज़ का जादूगर :)? – BillW

0

यहां एक समाधान है जो आपको जहां भी चाहें & ड्रॉप नोड खींचने की अनुमति देता है। एक नोड को एक और नोड के समान स्तर पर ले जाने के लिए, नोड को छोड़ते समय बस शिफ्ट दबाएं। विकल्प और उनकी संभावित समस्याओं की तुलना में यह वास्तव में आसान तरीका है। उदाहरण .Net (4.5) के एक नवीनतम संस्करण के साथ लिखा गया था।

नोट: सुनिश्चित करें और ट्रीव्यू नियंत्रण पर TrueDrop = true अन्यथा आप नोड्स को नहीं छोड़ सकते हैं।

/// <summary> 
/// Handle user dragging nodes in treeview 
/// </summary> 
private void treeView1_ItemDrag(object sender, ItemDragEventArgs e) 
{ 
    DoDragDrop(e.Item, DragDropEffects.Move); 
} 

/// <summary> 
/// Handle user dragging node into another node 
/// </summary> 
private void treeView1_DragEnter(object sender, DragEventArgs e) 
{ 
    e.Effect = DragDropEffects.Move; 
} 

/// <summary> 
/// Handle user dropping a dragged node onto another node 
/// </summary> 
private void treeView1_DragDrop(object sender, DragEventArgs e) 
{ 
    // Retrieve the client coordinates of the drop location. 
    Point targetPoint = treeView1.PointToClient(new Point(e.X, e.Y)); 

    // Retrieve the node that was dragged. 
    TreeNode draggedNode = e.Data.GetData(typeof(TreeNode)); 

    // Sanity check 
    if (draggedNode == null) 
    { 
     return; 
    } 

    // Retrieve the node at the drop location. 
    TreeNode targetNode = treeView1.GetNodeAt(targetPoint); 

    // Did the user drop the node 
    if (targetNode == null) 
    { 
     draggedNode.Remove(); 
     treeView1.Nodes.Add(draggedNode); 
     draggedNode.Expand(); 
    } 
    else 
    { 
     TreeNode parentNode = targetNode; 

     // Confirm that the node at the drop location is not 
     // the dragged node and that target node isn't null 
     // (for example if you drag outside the control) 
     if (!draggedNode.Equals(targetNode) && targetNode != null) 
     { 
      bool canDrop = true; 
      while (canDrop && (parentNode != null)) 
      { 
       canDrop = !Object.ReferenceEquals(draggedNode, parentNode); 
       parentNode = parentNode.Parent; 
      } 

      if (canDrop) 
      { 
       // Have to remove nodes before you can move them. 
       draggedNode.Remove(); 

       // Is the user holding down shift? 
       if (e.KeyState == 4) 
       { 
        // Is the targets parent node null? 
        if (targetNode.Parent == null) 
        { 
         // The target node has no parent. That means 
         // the target node is at the root level. We'll 
         // insert the node at the root level below the 
         // target node. 
         treeView1.Nodes.Insert(targetNode.Index + 1, draggedNode); 
        } 
        else 
        { 
         // The target node has a valid parent so we'll 
         // drop the node into it's index. 
         targetNode.Parent.Nodes.Insert(targetNode.Index + 1, draggedNode); 
        } 
       } 
       else 
       { 
        targetNode.Nodes.Add(draggedNode); 
       } 

       targetNode.Expand(); 
      } 
     } 
    } 

    // Optional: The following lines are an example of how you might 
    // provide a better experience by highlighting and displaying the 
    // content of the dropped node. 
    // treeView1.SelectedNode = draggedNode; 
    // NavigateToNodeContent(draggedNode.Tag); 
} 
संबंधित मुद्दे