2010-01-21 36 views
7

This question gần với những gì tôi quan tâm, nhưng không hoàn toàn.Kéo và thả loại đối tượng tùy chỉnh trong WinForms C#

Tôi có ứng dụng .NET WinForms được viết bằng C#. Tôi có một điều khiển ListView hiển thị một mảng các đối tượng C#. Tôi đã nối nó lên để bạn có thể kéo/thả các mục listview này vào một biểu mẫu khác trong cùng một ứng dụng, và nó chuyển đúng mảng các đối tượng (loại Session) đến trình xử lý thả cho biểu mẫu kia.

Tuy nhiên, bây giờ tôi muốn hỗ trợ kéo/thả qua nhiều nơi tôi chạy nhiều phiên bản ứng dụng của mình. Điều này xuất hiện rằng nó sẽ hoạt động (ví dụ: GetDataPresent thành công), nhưng cuối cùng ném một ngoại lệ khi tôi thực sự cố gắng truy xuất dữ liệu-- không thể đúc object[] đến Session[].

if (e.Data.GetDataPresent("Fiddler.Session[]")) 
{ 
    Session[] oDroppedSessions; 
    try 
    { 
     oDroppedSessions = (Session[])e.Data.GetData("Fiddler.Session[]"); 
    } 
    catch (Exception eX) 
    { // reaches here 
    } 
} 

Bất cứ ai cũng biết nếu tôi phải thực hiện ISerializable cho các đối tượng của tôi để làm cho công việc này? Thông thường, tôi chỉ đơn giản là thử nó, nhưng thực hiện ISerializable cho lớp này sẽ là khá tầm thường, và tôi lo lắng rằng có thể có những tác dụng phụ lạ khi làm như vậy.


CẬP NHẬT: Thực hiện ISerializable không help-- phương pháp này là không bao giờ gọi. Tương tự, việc thêm thuộc tính Serializable vào lớp không có tác động gì cả. Bất kỳ ý tưởng nào khác?

+0

Thêm dòng 'Console.WriteLine (string.Format ("Ngoại lệ bị bắt. Chi tiết là {0}", eX.ToString()));' trong khối đánh bắt. Tin nhắn sẽ là gì? – t0mm13b

+0

"không thể truyền đối tượng [] đến Phiên []" – EricLaw

Trả lời

4

Bạn đang vượt qua ranh giới quy trình, tham chiếu đối tượng không hợp lệ trong quy trình khác. Lớp DataObject hỗ trợ serializing các đối tượng để có được chúng trên tường, nó sử dụng BinaryFormatter. Vì vậy, có, bạn sẽ cần phải áp dụng các [Serializable] thuộc tính cho lớp học của bạn và chắc chắn rằng các đối tượng của bạn có thể de/serialize đúng.

+0

Vâng, đó là điều tôi sợ. Bất kỳ ý tưởng nếu tôi sẽ giới thiệu hồi quy hiệu suất nếu tôi thực hiện ISerializable? Sự tuần tự hóa nhị phân của đối tượng này có thể là hàng trăm KB. – EricLaw

+0

Hãy cho chúng tôi biết khi nào bạn tìm ra. –

+0

Hmmm ...triển khai ISerializable không giúp ích-- phương pháp này không bao giờ được gọi. Tương tự, việc thêm thuộc tính Serializable vào lớp không có tác động gì cả. Bất kỳ ý tưởng nào khác? – EricLaw

-1

Bạn có thể sử dụng "làm" để truyền sẽ tránh ngoại lệ ("như" sẽ trả về "null" mà không ném ngoại lệ nếu diễn viên không thành công) - nhưng tôi không nghĩ rằng điều này sẽ giải quyết được vấn đề của bạn chỉ cần tránh các ngoại lệ thực tế), như tôi đồng ý nó có khả năng bạn sẽ phải làm cho lớp của bạn Serializable. Bạn có thể kiểm tra giả thuyết của bạn bằng cách bình luận ra các lĩnh vực sẽ khó khăn hơn để làm cho nó hoạt động - chỉ để bây giờ để kiểm tra nó.

+1

-1: Giao dịch 'InvalidCastException' cho' NullReferenceException' là mất thông tin. Từ khóa 'as' là tốt nếu bạn mong đợi rằng một dàn diễn viên * có thể * thất bại. Nếu không, đó là xấu, và tôi đã nhìn thấy nó lạm dụng rất nhiều. –

0

Ok đây là một shot, thay vì sử dụng một mảng toàn bộ phiên, cố gắng thực hiện nó từng như thế này ...

 
    Session[] oDroppedSessions; 
    try 
    { 
     if (e.Data.GetData("Fiddler.Session[]") != null){ 
      object[] objs = e.Data.GetData("Fiddler.Session[]"); 
      if (objs != null && objs.Length > 1){ 
      oDroppedSessions = new Session[objs.Length]; 
      int nIndex = 0; 
      foreach(object obj in objs){ 
       if (obj is Session){ 
        oDroppedSessions[nIndex] = (Session)obj; 
        nIndex++; 
       } 
      } 
      } 
     } 
    } 
    catch (Exception eX) 
    { // reaches here } 

Worth một shot, trừ chụp bản thân mình trong chân như tôi không hiểu đầy đủ về phần Phiên, hãy thử ...

Hy vọng điều này sẽ giúp ích, Trân trọng, Tom.

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