파일을 응용 프로그램으로 끌어서 놓는 방법


251

나는 이것이 Borland의 Turbo C ++ 환경 에서 수행되는 것을 보았지만 현재 작업중 인 C # 응용 프로그램에서 어떻게 해야하는지 잘 모르겠습니다. 모범 사례 또는주의해야 할 사항이 있습니까?


C # 응용 프로그램 또는 C # IDE로 끌어서 놓기를 의미합니까?
JamesSugrue

4
cource, C # Application. 그는 응용 프로그램을 드래그 앤 드롭 방식으로 만들기를 원합니다.
SLA80

3
link 에서 더 유용한 답변 .
Venkatesh Kumar

답변:


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
면책 조항 : Windows 7에서 Visual Studio를 관리자로 실행하거나 프로그램을 관리자로 실행하면 디버그에서 작동하지 않을 수 있습니다. 여기를
Matthieu

파일 내용을 어떻게 얻습니까?
Burnsys

3
@Burnsys 드래그 조작에서 파일 경로가 있다면io.File
Smith

1
아뇨 디자이너에서 AllowDrop 속성을 True로 설정하고 거기서부터 추론하십시오.
Hans Passant

2
(string[])캐스트는 어떤 FileDrop형식의 낙하 에도 안전한 가요 ? 즉, FileDrop잘못된 캐스트 예외를 유발하는 을 생성 할 수 string[]있습니까? 나는 문서 에서 그것을 알아내는 데 어려움을 겪고있다 .
kdbanman

140

Windows Vista / Windows 7 보안 권한을 알고 있어야합니다. Visual Studio를 관리자로 실행중인 경우 Visual Studio 내에서 실행할 때 비 관리자 탐색기 창에서 프로그램으로 파일을 끌어 올 수 없습니다. 드래그 관련 이벤트는 시작되지 않습니다! 나는 이것이 다른 누군가가 그들의 삶의 시간을 낭비하지 않도록 도와주기를 희망합니다 ...


6
@Wayne Uroda : 내 코드가 작동하지 않는다고 생각했습니다 . 이 en.wikipedia.org/wiki/File:ProhibitionSign2.svg 와 같이 큰 "기호 없음"을 표시하고 있었습니다. 그런 다음이 답변을보고 관리자가 아닌 사람으로 VS를 실행하여 작동합니다! 정말 감사합니다.
Derek W

이것에 대해 충분히 감사 할 수는 없습니다.이 게시물을 찾지 못하면 포기했을 것입니다! 2017 년 Windows 10에서 작성했을 때와 마찬가지로 유효합니다.
Culme

42

Windows Forms에서 컨트롤의 AllowDrop 속성을 설정 한 다음 DragEnter 이벤트와 DragDrop 이벤트를 수신합니다.

하면 DragEnter이벤트가 발생이 설정 인수입니다 AllowedEffect없음 (예 이외의 다른 e.Effect = DragDropEffects.Move).

DragDrop이벤트가 화재, 당신은 문자열 목록을 얻을 것이다. 각 문자열은 삭제되는 파일의 전체 경로입니다.


16

문제에 대해 알고 있어야합니다. 끌어서 놓기 작업에서 DataObject 로 전달하는 모든 클래스는 직렬화 가능해야합니다. 따라서 개체를 시도하여 전달 했는데도 작동하지 않는 경우 문제가 될 수 있으므로 직렬화 할 수 있는지 확인하십시오. 이것은 몇 번 나에게 걸렸다!


14

또 다른 문제 :

드래그 이벤트를 호출하는 프레임 워크 코드는 모든 예외를 삼킨다. 이벤트 코드가 원활하게 실행되는 동안 모든 곳에서 예외가 발생한다고 생각할 수 있습니다. 프레임 워크가 훔치기 때문에 볼 수 없습니다.

그렇기 때문에 항상 이러한 이벤트 핸들러에 try / catch를 넣습니다. 예외가 발생하는지 알고 있습니다. 나는 보통 Debugger.Break (); 캐치 부분에서.

릴리스 전, 테스트 후 모든 것이 작동하는 것 같으면이를 실제 예외 처리로 제거하거나 교체합니다.


9

또 다른 일반적인 문제는 Form DragOver (또는 DragEnter) 이벤트를 무시할 수 있다고 생각하는 것입니다. 일반적으로 폼의 DragOver 이벤트를 사용하여 AllowedEffect를 설정 한 다음 특정 컨트롤의 DragDrop 이벤트를 사용하여 삭제 된 데이터를 처리합니다.


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

디자이너에서 Judah Himango와 Hans Passant의 솔루션을 사용할 수 있습니다 (현재 VS2015를 사용하고 있습니다).

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오


0

WinForms 및 WPF에서 Drag & Drop을 구현할 수 있습니다.

  • WinForm (앱 창에서 드래그)

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);
         }
     ...
    }
  • WinForm (앱 창으로 드래그)

DragDrop 이벤트를 추가해야합니다.

private void YourElementControl_DragDrop (객체 발신자, DragEventArgs e)

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

전체 코드 소스 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.