मैं फ़ाइलों को किसी अनुप्रयोग में कैसे खींचूं और छोड़ूं?


251

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


क्या आपका मतलब है कि C # Application में या C # IDE में ड्रैग एंड ड्रॉप?
जेम्ससुग्रे

4
आंगन की, सी # आवेदन। वह अपने एप्लिकेशन को ड्रैग एंड ड्रॉप फ्रेंडली बनाना चाहते हैं।
SLA80

3
लिंक पर अधिक उपयोगी जवाब ।
वेंकटेश कुमार

जवाबों:


505

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

  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);
    }
  }

56
अस्वीकरण: यह डिबग में काम नहीं कर सकता है यदि आप विंडोज 7 में एक व्यवस्थापक के रूप में विजुअल स्टूडियो चलाते हैं, या यदि आप एक व्यवस्थापक के रूप में अपना कार्यक्रम चलाते हैं। यहाँ
Matthieu

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

3
@Burnsys यदि आपके पास ड्रैग ऑपरेशन से फ़ाइलपथ है, तो आप पढ़ सकते हैंio.File
स्मिथ

1
ऊ, नहीं। डिज़ाइनर में AllowDrop प्रॉपर्टी को True पर सेट करें और वहाँ से इसका कारण बताएं।
हंस पैसेंट

2
क्या (string[])किसी भी FileDropविकृत बूंद के लिए कलाकार सुरक्षित है ? यही है, क्या यह संभव है FileDropकि एक अवैध कास्ट अपवाद का कारण होगा string[]? मुझे यह समझने में समस्या हो रही है कि डॉक्स से बाहर ।
kdbanman

140

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


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

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

42

Windows प्रपत्र में, नियंत्रण की AllowDrop गुण सेट करें, फिर DragEnter ईवेंट और DragDrop ईवेंट के लिए सुनें।

जब DragEnterघटना भड़कती है, तो तर्क AllowedEffectको कुछ नहीं (उदाहरण के लिए e.Effect = DragDropEffects.Move) के अलावा कुछ और सेट करें

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


16

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


14

अभी तक एक और gotcha:

ड्रैग-ईवेंट को कॉल करने वाला फ्रेमवर्क कोड सभी अपवादों को निगल जाता है। आपको लगता है कि आपका ईवेंट कोड सुचारू रूप से चल रहा है, जबकि यह सभी जगह अपवाद है। आप उन्हें नहीं देख सकते क्योंकि फ्रेम उन्हें चुरा रहा है।

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

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


9

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


7

यहाँ कुछ है जो मैं फ़ाइलों और / या फ़ाइलों से भरे फ़ोल्डर्स को छोड़ने के लिए उपयोग करता था। मेरे मामले में मैं *.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);
    }
  }

3

जुडाह हिमांगो और हंस पैसेंट का समाधान डिजाइनर में उपलब्ध है (मैं वर्तमान में VS2015 का उपयोग कर रहा हूं):

यहां छवि विवरण दर्ज करें

यहां छवि विवरण दर्ज करें


0

आप WinForms और WPF में ड्रैग एंड ड्रॉप को लागू कर सकते हैं।

  • WinForm (एप्लिकेशन विंडो से खींचें)

आपको मूसमव इवेंट जोड़ना चाहिए:

private void YourElementControl_MouseMove(object sender, MouseEventArgs e)

    {
     ...
         if (e.Button == MouseButtons.Left)
         {
                 DoDragDrop(new DataObject(DataFormats.FileDrop, new string[] { PathToFirstFile,PathToTheNextOne }), DragDropEffects.Move);
         }
     ...
    }
  • WinForm (एप्लिकेशन विंडो पर खींचें)

आपको ड्रैगड्रॉप इवेंट जोड़ना चाहिए:

निजी शून्य YourElementControl_DragDrop (ऑब्जेक्ट प्रेषक, DragEventArgs e)

    {
       ...
       foreach (string path in (string[])e.Data.GetData(DataFormats.FileDrop))
            {
                File.Copy(path, DirPath + Path.GetFileName(path));
            }
       ...
    }

पूर्ण कोड के साथ स्रोत

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.