나는 이것이 Borland의 Turbo C ++ 환경 에서 수행되는 것을 보았지만 현재 작업중 인 C # 응용 프로그램에서 어떻게 해야하는지 잘 모르겠습니다. 모범 사례 또는주의해야 할 사항이 있습니까?
나는 이것이 Borland의 Turbo 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
Windows Vista / Windows 7 보안 권한을 알고 있어야합니다. Visual Studio를 관리자로 실행중인 경우 Visual Studio 내에서 실행할 때 비 관리자 탐색기 창에서 프로그램으로 파일을 끌어 올 수 없습니다. 드래그 관련 이벤트는 시작되지 않습니다! 나는 이것이 다른 누군가가 그들의 삶의 시간을 낭비하지 않도록 도와주기를 희망합니다 ...
Windows Forms에서 컨트롤의 AllowDrop 속성을 설정 한 다음 DragEnter 이벤트와 DragDrop 이벤트를 수신합니다.
하면 DragEnter
이벤트가 발생이 설정 인수입니다 AllowedEffect
없음 (예 이외의 다른 e.Effect = DragDropEffects.Move
).
때 DragDrop
이벤트가 화재, 당신은 문자열 목록을 얻을 것이다. 각 문자열은 삭제되는 파일의 전체 경로입니다.
문제에 대해 알고 있어야합니다. 끌어서 놓기 작업에서 DataObject 로 전달하는 모든 클래스는 직렬화 가능해야합니다. 따라서 개체를 시도하여 전달 했는데도 작동하지 않는 경우 문제가 될 수 있으므로 직렬화 할 수 있는지 확인하십시오. 이것은 몇 번 나에게 걸렸다!
다음은 파일로 가득 찬 파일 및 / 또는 폴더를 삭제하는 데 사용한 것입니다. 필자의 경우 *.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에서 Drag & Drop을 구현할 수 있습니다.
mousemove 이벤트를 추가해야합니다.
private void YourElementControl_MouseMove(object sender, MouseEventArgs e)
{
...
if (e.Button == MouseButtons.Left)
{
DoDragDrop(new DataObject(DataFormats.FileDrop, new string[] { PathToFirstFile,PathToTheNextOne }), DragDropEffects.Move);
}
...
}
DragDrop 이벤트를 추가해야합니다.
private void YourElementControl_DragDrop (객체 발신자, DragEventArgs e)
{
...
foreach (string path in (string[])e.Data.GetData(DataFormats.FileDrop))
{
File.Copy(path, DirPath + Path.GetFileName(path));
}
...
}
전체 코드 소스 .