मैंने इसे बोरलैंड के टर्बो सी ++ वातावरण में किया है, लेकिन मुझे यकीन नहीं है कि मैं जिस C # एप्लिकेशन पर काम कर रहा हूं, उसके बारे में कैसे जाना है। क्या बाहर देखने के लिए सर्वोत्तम प्रथाएं या गोत्र हैं?
मैंने इसे बोरलैंड के टर्बो सी ++ वातावरण में किया है, लेकिन मुझे यकीन नहीं है कि मैं जिस C # एप्लिकेशन पर काम कर रहा हूं, उसके बारे में कैसे जाना है। क्या बाहर देखने के लिए सर्वोत्तम प्रथाएं या गोत्र हैं?
जवाबों:
कुछ नमूना कोड:
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);
}
}
io.File
विस्टा / विंडोज़ 7 सुरक्षा अधिकारों से अवगत रहें - यदि आप विजुअल स्टूडियो को प्रशासक के रूप में चला रहे हैं, तो जब आप दृश्य स्टूडियो के भीतर से इसे चलाते हैं, तो आप किसी गैर-व्यवस्थापक एक्सप्लोरर विंडो से फ़ाइलों को अपने प्रोग्राम में नहीं खींच पाएंगे। खींचें संबंधित घटनाओं में आग भी नहीं लगेगी! मुझे आशा है कि यह किसी और को उनके जीवन के घंटों को बर्बाद न करने में मदद करेगा ...
Windows प्रपत्र में, नियंत्रण की AllowDrop गुण सेट करें, फिर DragEnter ईवेंट और DragDrop ईवेंट के लिए सुनें।
जब DragEnter
घटना भड़कती है, तो तर्क AllowedEffect
को कुछ नहीं (उदाहरण के लिए e.Effect = DragDropEffects.Move
) के अलावा कुछ और सेट करें
जब DragDrop
घटना भड़कती है, तो आपको तार की एक सूची मिलेगी। प्रत्येक स्ट्रिंग फ़ाइल को गिराए जाने का पूर्ण पथ है।
आपको गोत्र के बारे में पता होना चाहिए। ड्रैग / ड्रॉप ऑपरेशन में DataObject के रूप में आप जिस भी क्लास से गुजरते हैं, उसे Serializable होना चाहिए। इसलिए यदि आप किसी ऑब्जेक्ट को आज़माते हैं और पास करते हैं, और यह काम नहीं कर रहा है, तो सुनिश्चित करें कि इसे क्रमबद्ध किया जा सकता है क्योंकि यह लगभग निश्चित ही समस्या है। इसने मुझे एक दो बार पकड़ा है!
अभी तक एक और gotcha:
ड्रैग-ईवेंट को कॉल करने वाला फ्रेमवर्क कोड सभी अपवादों को निगल जाता है। आपको लगता है कि आपका ईवेंट कोड सुचारू रूप से चल रहा है, जबकि यह सभी जगह अपवाद है। आप उन्हें नहीं देख सकते क्योंकि फ्रेम उन्हें चुरा रहा है।
इसलिए मैं हमेशा इन इवेंट हैंडलर में एक कोशिश / पकड़ रखता हूं, बस मुझे पता है कि क्या वे किसी अपवाद को फेंकते हैं। मैं आमतौर पर एक डिबगर लगाता हूं। क्रेक (); कैच भाग में।
रिलीज से पहले, परीक्षण के बाद, अगर सब कुछ व्यवहार करने लगता है, तो मैं वास्तविक अपवाद हैंडलिंग के साथ इन्हें हटा देता हूं या बदल देता हूं।
एक और आम गोचा यह सोच रहा है कि आप फॉर्म ड्रैगओवर (या ड्रैगनेटर) घटनाओं को नजरअंदाज कर सकते हैं। मैं आमतौर पर AllowedEffect को सेट करने के लिए फ़ॉर्म के ड्रैगओवर इवेंट का उपयोग करता हूं, और फिर गिराए गए डेटा को संभालने के लिए एक विशिष्ट नियंत्रण के ड्रैगड्रॉप इवेंट का उपयोग करता हूं।
यहाँ कुछ है जो मैं फ़ाइलों और / या फ़ाइलों से भरे फ़ोल्डर्स को छोड़ने के लिए उपयोग करता था। मेरे मामले में मैं *.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);
}
}
आप WinForms और WPF में ड्रैग एंड ड्रॉप को लागू कर सकते हैं।
आपको मूसमव इवेंट जोड़ना चाहिए:
private void YourElementControl_MouseMove(object sender, MouseEventArgs e)
{
...
if (e.Button == MouseButtons.Left)
{
DoDragDrop(new DataObject(DataFormats.FileDrop, new string[] { PathToFirstFile,PathToTheNextOne }), DragDropEffects.Move);
}
...
}
आपको ड्रैगड्रॉप इवेंट जोड़ना चाहिए:
निजी शून्य YourElementControl_DragDrop (ऑब्जेक्ट प्रेषक, DragEventArgs e)
{
...
foreach (string path in (string[])e.Data.GetData(DataFormats.FileDrop))
{
File.Copy(path, DirPath + Path.GetFileName(path));
}
...
}