[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);
    }
  }


답변

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


답변

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

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

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


답변

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


답변

또 다른 문제 :

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

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

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


답변

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


답변

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