2008-09-16 11 views
203

मैंने यह देखा है कि यह बोर्लैंड के Turbo C++ पर्यावरण में किया गया है, लेकिन मुझे यकीन नहीं है कि सी # एप्लिकेशन के लिए मैं इसके बारे में कैसे जा रहा हूं। क्या देखने के लिए सर्वोत्तम प्रथाएं या गठिया हैं?मैं फ़ाइलों को किसी एप्लिकेशन में कैसे खींचूं और छोड़ूं?

+0

आप एक सी # आवेदन में या सी # आईडीई में खींचें और ड्रॉप मतलब क्या ? – JamesSugrue

+2

cource, सी # आवेदन। वह अपना आवेदन खींचना और दोस्ताना छोड़ना चाहता है। – SLA80

+3

[लिंक] पर अधिक उपयोगी उत्तर (http://helgeklein.com/blog/2010/03/how-to-enable-drag-and-drop-for-an-elevated-mfc-plplication-on-vistawindows-7 /)। –

उत्तर

37

विंडोज़ फॉर्म में, नियंत्रण की AllowDrop प्रॉपर्टी सेट करें, फिर DragEnter ईवेंट और ड्रैगड्रॉप ईवेंट को सुनें।

जब DragEnter ईवेंट आग लगती है, तो तर्क के AllowedEffect को किसी अन्य के अलावा किसी अन्य चीज़ पर सेट करें (उदा। e.Effect = DragDropEffects.Move)।

जब DragDrop ईवेंट आग लगती है, तो आपको तारों की एक सूची मिल जाएगी। प्रत्येक स्ट्रिंग फ़ाइल को गिराए जाने का पूरा पथ है।

16

आपको गॉचा के बारे में पता होना चाहिए। ड्रैग/ड्रॉप ऑपरेशन में DataObject के रूप में आप जो भी कक्षा पार करते हैं, वह Serializable होना चाहिए। तो यदि आप किसी ऑब्जेक्ट को आज़माकर पास करते हैं, और यह काम नहीं कर रहा है, तो सुनिश्चित करें कि इसे क्रमबद्ध किया जा सकता है क्योंकि यह लगभग निश्चित रूप से समस्या है। इसने मुझे दो बार पकड़ा है!

6

एक और आम गोचा सोच रहा है कि आप फॉर्म ड्रैगओवर (या ड्रैगएंटर) ईवेंट को अनदेखा कर सकते हैं। मैं आमतौर पर दिए गए डेटा को संभालने के लिए AllowedEffect सेट करने के लिए फॉर्म के ड्रैगओवर ईवेंट का उपयोग करता हूं, और उसके बाद एक विशिष्ट नियंत्रण ड्रैगड्रॉप ईवेंट का उपयोग करता हूं।

439

कुछ नमूना कोड:

public partial class Form1 : Form { 
    public Form1() { 
     InitializeComponent(); 
     this.AllowDrop = true; 
     this.DragEnter += new DragEventHandler(Form1_DragEnter); 
     this.DragDrop += new DragEventHandler(Form1_DragDrop); 
    } 

    void Form1_DragEnter(object sender, DragEventArgs e) { 
     if (e.Data.GetDataPresent(DataFormats.FileDrop)) e.Effect = DragDropEffects.Copy; 
    } 

    void Form1_DragDrop(object sender, DragEventArgs e) { 
     string[] files = (string[])e.Data.GetData(DataFormats.FileDrop); 
     foreach (string file in files) Console.WriteLine(file); 
    } 
    } 
+38

अस्वीकरण: यदि आप विजुअल स्टूडियो को विंडोज 7 में व्यवस्थापक के रूप में चलाते हैं, या यदि आप अपने प्रोग्राम को व्यवस्थापक के रूप में चलाते हैं तो यह डीबग में काम नहीं कर सकता है। [यहां] देखें (http://stackoverflow.com/questions/2833709/c-sharp-drag-drop-does-not-work-on-windows-7) – Matthieu

+0

आप फ़ाइलों की सामग्री कैसे प्राप्त करते हैं? – Burnsys

+3

@ बर्नसी अगर आपके पास ड्रैग ऑपरेशन से फ़ाइलपैथ है, तो आप 'io.File' – Smith

10

फिर भी एक और पकड़ लिया: कॉल खींचें घटनाओं सभी अपवादों को निगल

ढांचे कोड। आपको लगता है कि आपका इवेंट कोड सुचारू रूप से चल रहा है, जबकि यह पूरे स्थान पर अपवादों को घुमा रहा है। आप उन्हें नहीं देख सकते क्योंकि ढांचा उन्हें चुरा लेता है।

यही कारण है कि मैं हमेशा इन घटना हैंडलरों में कोशिश/पकड़ डालता हूं, इसलिए मुझे पता है कि क्या उन्होंने कोई अपवाद फेंक दिया है। मैं आमतौर पर एक डीबगर डालता हूं। ब्रेक(); पकड़ भाग में।

रिलीज से पहले, परीक्षण के बाद, अगर सब कुछ व्यवहार करने लगता है, तो मैं इन्हें असली अपवाद हैंडलिंग के साथ हटा देता हूं या बदल देता हूं।

120

विंडोज विस्टा/विंडोज 7 सुरक्षा अधिकारों से अवगत रहें - यदि आप विजुअल स्टूडियो को व्यवस्थापक के रूप में चला रहे हैं, तो आप इसे अपने प्रोग्राम में गैर-व्यवस्थापक एक्सप्लोरर विंडो से फ़ाइलों को खींचने में सक्षम नहीं होंगे जब आप इसे विजुअल स्टूडियो के भीतर से चलाते हैं । ड्रैग से संबंधित घटनाएं भी आग नहीं लगीं! मुझे आशा है कि इससे किसी और की मदद मिलेगी, उनके जीवन के घंटों को बर्बाद न करें ...

+5

@ वेयने उरोदा: मैंने सोचा था कि मेरा कोड काम नहीं कर रहा था - बिल्ली यह मुझे इस तरह की एक बड़ी "कोई प्रतीक" नहीं दे रहा था http://en.wikipedia.org/wiki/File:ProhibitionSign2.svg। तब मैंने यह जवाब देखा और एक गैर-व्यवस्थापक के रूप में वीएस चलाया और यह काम करता है! बहुत - बहुत धन्यवाद। –

+0

इसके लिए पर्याप्त धन्यवाद नहीं दे सकता, मैं तब तक छोड़ देता जब तक कि मुझे यह पोस्ट नहीं मिला! यह 2017 में विंडोज 10 में मान्य है क्योंकि जब आपने इसे लिखा था। – Culme

3

यहां कुछ ऐसा है जो मैं फ़ाइलों और/या फ़ाइलों से भरे फ़ोल्डर्स को छोड़ देता था। मेरे मामले में मैं केवल *.dwg फ़ाइलों के लिए फ़िल्टर कर रहा था और सभी सबफ़ोल्डर को शामिल करना चुना।

fileList एक IEnumerable या इसी तरह मेरे मामले में एक WPF नियंत्रण करने के लिए बाध्य किया गया था ...

var fileList = (IList)FileList.ItemsSource; 

कि चाल के विवरण के लिए https://stackoverflow.com/a/19954958/492 देखें।

ड्रॉप हैंडलर ...

private void FileList_OnDrop(object sender, DragEventArgs e) 
    { 
    var dropped = ((string[])e.Data.GetData(DataFormats.FileDrop)); 
    var files = dropped.ToList(); 

    if (!files.Any()) 
     return; 

    foreach (string drop in dropped) 
     if (Directory.Exists(drop)) 
     files.AddRange(Directory.GetFiles(drop, "*.dwg", SearchOption.AllDirectories)); 

    foreach (string file in files) 
    { 
     if (!fileList.Contains(file) && file.ToLower().EndsWith(".dwg")) 
     fileList.Add(file); 
    } 
    } 
0

यहूदा Himango और हंस Passant का समाधान डिजाइनर में उपलब्ध है (मैं वर्तमान में VS2015 उपयोग कर रहा हूँ): enter image description here enter image description here

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