2009-01-30 11 views
12

पर खींचें और छोड़ें मेरे पास एक सूची बॉक्स और एक वृक्षदृश्य के साथ एक Winform है।सी # सूची बॉक्स से पेड़दृश्य

एक बार मेरा सूची बॉक्स आइटम से भर जाता है, तो मैं उन्हें सूची बॉक्स से (एकाधिक या एकल) खींचना चाहता हूं और उन्हें वृक्षदृश्य में नोड में छोड़ना चाहता हूं।

अगर किसी के पास सी # में एक अच्छा उदाहरण है तो यह बहुत अच्छा होगा।

+1

क्या आप अपनी पोस्ट संपादित कर सकते हैं और हमें बता सकते हैं कि आपको किस समस्या का सामना करना पड़ रहा है? यहां पर लोग "कृपया कोड को भेजें" टाइप करने के लिए अच्छी प्रतिक्रिया नहीं देते हैं –

उत्तर

23

यह कुछ समय हो गया है क्योंकि मैंने ड्रैग/ड्रॉप से ​​गड़बड़ कर ली है, इसलिए मुझे लगा कि मैं एक त्वरित नमूना लिखूंगा।

असल में, मेरे पास एक फॉर्म है, बाईं ओर एक सूची बॉक्स के साथ, और दाईं ओर एक वृक्षदृश्य। फिर मैंने शीर्ष पर एक बटन रखा। जब बटन क्लिक किया जाता है, तो यह अगले दस दिनों की तारीख सूची बॉक्स में रखता है। यह ट्री व्यू को 2 माता-पिता नोड्स और दो बाल नोड्स के साथ भी पॉप्युलेट करता है। फिर, आपको इसे काम करने के लिए सभी बाद के ड्रैग/ड्रॉप ईवेंट को संभालना होगा।

public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
      this.treeView1.AllowDrop = true; 
      this.listBox1.AllowDrop = true; 
      this.listBox1.MouseDown += new MouseEventHandler(listBox1_MouseDown); 
      this.listBox1.DragOver += new DragEventHandler(listBox1_DragOver); 

      this.treeView1.DragEnter += new DragEventHandler(treeView1_DragEnter); 
      this.treeView1.DragDrop += new DragEventHandler(treeView1_DragDrop); 

     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      this.PopulateListBox(); 
      this.PopulateTreeView(); 
     } 

     private void PopulateListBox() 
     { 
      for (int i = 0; i <= 10; i++) 
      { 
       this.listBox1.Items.Add(DateTime.Now.AddDays(i)); 
      } 
     } 

     private void PopulateTreeView() 
     { 
      for (int i = 1; i <= 2; i++) 
      { 
       TreeNode node = new TreeNode("Node" + i); 
       for (int j = 1; j <= 2; j++) 
       { 
        node.Nodes.Add("SubNode" + j); 
       } 
       this.treeView1.Nodes.Add(node); 
      } 
     } 

     private void treeView1_DragDrop(object sender, DragEventArgs e) 
     { 

      TreeNode nodeToDropIn = this.treeView1.GetNodeAt(this.treeView1.PointToClient(new Point(e.X, e.Y))); 
      if (nodeToDropIn == null) { return; } 
      if(nodeToDropIn.Level > 0) 
      { 
       nodeToDropIn = nodeToDropIn.Parent; 
      } 

      object data = e.Data.GetData(typeof(DateTime)); 
      if (data == null) { return; } 
      nodeToDropIn.Nodes.Add(data.ToString()); 
      this.listBox1.Items.Remove(data); 
     } 

     private void listBox1_DragOver(object sender, DragEventArgs e) 
     { 
      e.Effect = DragDropEffects.Move; 
     } 

     private void treeView1_DragEnter(object sender, DragEventArgs e) 
     { 
      e.Effect = DragDropEffects.Move; 
     } 

     private void listBox1_MouseDown(object sender, MouseEventArgs e) 
     { 
      this.listBox1.DoDragDrop(this.listBox1.SelectedItem, DragDropEffects.Move); 
     } 


    } 
+0

इसके लिए आपको बहुत बहुत धन्यवाद। मुझे बस यह पुष्टि करने के लिए एक कोड उदाहरण की आवश्यकता है कि मुझे मोनो में कम से कम "प्रभाव" ड्रैग नहीं मिल रहा है (कम से कम ओएसएक्स पर)। आपके महान और पूर्ण उदाहरण ने मुझे एक टन काम बचाया। –

3

आप एक्स, वाई स्थान को सूचीदृश्य आइटम में अनुवाद करने के लिए GetItemAt (पॉइंट पॉइंट) फ़ंक्शन का उपयोग करना चाहते हैं।

यहां इसके बारे में काफी अच्छा लेख है: Drag and Drop Using C#

खींचने के दौरान आइटम को खींचने के लिए, आपको COM ImageList का उपयोग करने की आवश्यकता है, जिसे निम्न आलेख Custom Drag-Drop Images Using ImageLists में वर्णित किया गया है।

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