1398-09-21 19:22 درگ فایل یا پوشه به نرم افزار
zahmah

 
سلام
در drag & drop به یک لیست باکس:
1. چه طوری میشود تشخیص داد که آیتم دراپ شده فایل است یا پوشه؟
2. چطوری مجوز اضافه کردن بیش از یک فایل به لیست باکس راندهیم؟

ممنون
1398-09-21 22:54
zahmah

 
private void listBox1_DragDrop(object sender, DragEventArgs e)
{
string[] FileList = (string[])e.Data.GetData(DataFormats.FileDrop, false);

listBox1.Items.Clear();
string s = "";

foreach (string File in FileList)
{
s = s + " " + File;
listBox1.Items.Add(s);
}
}
1398-09-22 21:01
حاجی شریفی
مؤسس سایت
 
سلام
رویدادی به نام Drag-Drop وجود دارد که این اطلاعات را پس میدهد.

بطور نمونه در WPF اول باید خصیصه AllowDrop=true را روی کنترلر مورد نظر تنظیم کنید.
این کنترلر میتواند یک TextBox ساده و یا کل Window جاری باشد.

بعد زمان شروع درگ رویداد DragEnter رخ میدهد و زمان رها شدن هم رویداد Drop را دارید
بطور نمونه برای گرفتن مسیر یک فایل میتوانید رویداد Drop را شبیه این نوشت.

using  System.Linq;
using System.Windows;
using System.Collections.Generic;

//...

private void Window_Drop(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent( DataFormats.FileDrop ))
{
this .txtFilePath.Text = ( e.Data.GetData( DataFormats.FileDrop ) as IEnumerable<string > )?.FirstOrDefault();
}
else if (e.Data.GetDataPresent( "FileNameW" ))
{
this .txtFilePath.Text = ( e.Data.GetData( "FileNameW" ) as IEnumerable<string > )?.FirstOrDefault();
}
else if (e.Data.GetDataPresent( "FileName" ))
{
this .txtFilePath.Text = ( e.Data.GetData( "FileName" ) as IEnumerable<string > )?.FirstOrDefault();
}
}


متد e.Data.GetFormats فهرست فرمت های موجود را پس میدهد.
همچنین کلاس ثابت DataFormats حاوی نام فرمت ها است.
متد e.Data.GetDataPresent بررسی میکند که شیء درگ شده جاری حاوی فلان فرمت است یا خیر.
متد e.Data.GetData هم داده ای با یک فرمت خاص را دریافت میکند.

برای درگ فایل ها و پوشه ها فرمت دیتا کلمه رزو شده FileDrop و همچنین کلمه FileNameW (یونیکدی) و FileName (اسکی) وجود دارد که حاوی آرایه string از نام فایل و پوشه های درگ شده است.
بطور مثال میتوانید در یک حلقله foreach همه را پردازش کنید و اولین پوشه Directory.Exists را بردارید ! یا هر کد دلخواه دیگری !

در WinForm هم خیلی شبیه همین است ...
باید AllowDrop=true کنید.
باید رویداد DragEnter را کدنویسی کنید و با رها شدن نوع شیء درگ شده موافقت کنید.
private void  Form1_DragEnter(object  sender, DragEventArgs e)
{
e.Effect = DragDropEffects.All;
}


درنهایت هم رویداد DragDrop را دقیق مانند قبل ( مانند رویداد Drop در WPF ) کدنویسی کنید.
موفق باشید.