2008-11-11 33 views
8

Tôi đang gặp sự cố khi kéo tệp từ Windows Explorer vào ứng dụng Windows Forms.Kéo và thả từ Windows File Explorer vào một Biểu mẫu Windows không hoạt động

Nó hoạt động tốt khi tôi kéo văn bản, nhưng vì lý do nào đó, nó không nhận ra tệp. Đây là mã thử nghiệm của tôi:

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_DragDrop(object sender, DragEventArgs e) 
     { 

     } 

     private void Form1_DragEnter(object sender, DragEventArgs e) 
     { 
      if (e.Data.GetDataPresent(DataFormats.Text)) 
      { 
       e.Effect = DragDropEffects.Copy; 
      } 
      else if (e.Data.GetDataPresent(DataFormats.FileDrop)) 
      { 
       e.Effect = DragDropEffects.Copy; 
      } 
      else 
      { 
       e.Effect = DragDropEffects.None; 
      } 
     } 
    } 
} 

AllowDrop được đặt thành đúng trên Form1 và như tôi đã đề cập, nó hoạt động nếu tôi kéo văn bản vào biểu mẫu, không phải tệp thực.

Tôi đang sử dụng Vista 64 bit ... không chắc chắn liệu đó có phải là một phần của sự cố hay không.

Trả lời

20

Sự cố xuất phát từ số UAC của Vista. DevStudio đang chạy với tư cách quản trị viên, nhưng trình khám phá đang chạy như một người dùng thông thường. Khi bạn kéo một tệp từ trình thám hiểm và thả nó vào ứng dụng được lưu trữ DevStudio của bạn, điều đó giống như một người dùng không có đặc quyền cố gắng liên lạc với một người dùng đặc quyền. Nó không được cho phép.

Điều này có thể sẽ không hiển thị khi bạn chạy ứng dụng bên ngoài trình gỡ lỗi. Trừ khi bạn chạy nó như một quản trị viên ở đó (hoặc nếu Vista tự động phát hiện rằng nó là một trình cài đặt/thiết lập ứng dụng).

Bạn cũng có thể run explorer as an admin, ít nhất là để thử nghiệm. Hoặc vô hiệu hóa UAC (mà tôi không khuyến nghị, vì bạn thực sự muốn nắm bắt những vấn đề này trong quá trình phát triển, không phải trong quá trình triển khai!)

+0

Vâng, điều đó giải đáp được một vấn đề mà tôi đã gặp phải với ứng dụng mà tôi đang làm việc. Một cách giải quyết tốt mà tôi đã tìm thấy cho phép bạn gỡ lỗi ứng dụng và vẫn có thao tác kéo và thả đúng cách là chạy ứng dụng bên ngoài trình gỡ lỗi và sau đó đính kèm trình gỡ lỗi vào tiến trình. – RobH

+0

Trong trường hợp bạn không cần Visual Studio để chạy cao, bạn cũng có thể chỉ cần chạy nó trong chế độ bình thường để kiểm tra kéo thả. Tuy nhiên, tôi sẽ đề nghị cài đặt VSCommands. Nó là một phần mở rộng cho phép bạn chạy một cửa sổ thám hiểm như quản trị cũng như một số công cụ gọn gàng khác, như tự động chọn các cá thể IIS liên quan để đính kèm vào khi gỡ lỗi - trong số những thứ khác. –

0

Mã bạn đã đăng nên hoạt động.

Hãy thử đặt này vào lúc bắt đầu của phương pháp DragEnter

string formats = string.Join("\n", e.Data.GetFormats(false)); 
MessageBox.Show(formats); 

mà sẽ đổ các định dạng dữ liệu liên quan đến hoạt động d'n'd. Có thể giúp chúng tôi thu hẹp vị trí của vấn đề.

+0

@arul Đã làm ... vẫn không hiệu quả, nhưng tìm thấy điều gì đó thú vị. Hãy nhìn vào câu trả lời của tôi. – mattruma

0

Tôi đã thêm mã mà arul được đề cập và mọi thứ vẫn không hoạt động, nhưng điều đó khiến tôi suy nghĩ.

Tôi bắt đầu nghĩ rằng nó có thể là một vấn đề Vista vì vậy tôi đã gửi nó cho một người bạn có Windows XP và nó đã làm việc tuyệt vời! Sau đó tôi đã thử chạy nó bên ngoài thư mục Release trong thư mục bin và bạn biết nó hoạt động ra sao!

Thời gian duy nhất nó không hoạt động là khi tôi chạy nó bên trong Visual Studio 2008 IDE ... điều đó thật kỳ lạ.

+0

Bạn có đang chạy Vis 'Studio làm Quản trị viên không? –

0

Bạn đã cố thêm thuộc tính STAThread vào phương pháp chính?

[STAThread] 
    static void Main(string[] args) 
    { 
    } 

Tôi gặp vấn đề tương tự như @mattruma có nghĩa là tôi không được kéo & Sự kiện thả. Sau khi thêm thuộc tính STAThread vào phương thức chính, nó hoạt động như mong đợi.

Các vấn đề liên quan