it-gundan.com

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

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

238
Samuel Paul

일부 샘플 코드 :

  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);
    }
  }
489
Hans Passant

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

136
Wayne Uroda

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

DragEnter 이벤트가 발생하면 인수의 AllowedEffect을 none 이외의 다른 것으로 설정하십시오 (예 : e.Effect = DragDropEffects.Move).

DragDrop 이벤트가 발생하면 문자열 목록이 표시됩니다. 각 문자열은 삭제되는 파일의 전체 경로입니다.

42

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

16
Phil Wright

또 다른 문제 :

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

그렇기 때문에 항상 이러한 이벤트 핸들러에 try/catch를 넣습니다. 나는 보통 Debugger.Break (); 캐치 부분에서.

릴리스하기 전에 테스트 후 모든 것이 작동하는 것처럼 보이면 실제 예외 처리로 제거하거나 교체합니다.

12
Guge

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

7
Craig Eddy

다음은 파일로 가득 찬 파일 및/또는 폴더를 삭제하는 데 사용한 것입니다. 제 경우에는 *.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);
    }
  }
7
CAD bloke

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

0
Roland