2011-07-01 48 views
5

Tôi có 2 điều khiển một biểu mẫu: danh sách và một cây (tên loại cụ thể không liên quan).Kéo và thả đối tượng tùy chỉnh

Trong điều khiển danh sách, tôi thực thi phương thức DoDragDrop. Khi đối số đầu tiên tôi chuyển một đối tượng là dữ liệu được liên kết với hàng đó. Đối tượng thực hiện một giao diện cụ thể và được đánh dấu bằng thuộc tính Serializable.

Điều tôi muốn là truy xuất đối tượng đó trong trình xử lý sự kiện DragEnter/DragDrop của điều khiển cây. Tôi đang sử dụng đoạn mã sau:

void TreeControlDragEnter(object sender, DragEventArgs e) 
{ 
    var formats = e.Data.GetFormats(); 
    var data = e.Data.GetData(typeof (IFoo)); 
} 

Thật không may, trong kết quả dữ liệu là null và các định dạng là một mảng một yếu tố mà giữ tên của loại hình cụ thể (thực hiện IFoo). Tôi giả sử rằng tôi sẽ phải truyền tên kiểu chính xác cho GetData để trả về đối tượng, nhưng không thể vì nó là một lớp riêng tư.

Có cách nào để nhận đối tượng bằng giao diện của nó không?

Trả lời

4

Bạn phải cung cấp cùng loại với lớp đã được đăng ký ở vị trí đầu tiên. Bạn không thể sử dụng một giao diện hoặc lớp cơ sở của lớp được tuần tự hóa bởi vì sau đó nhiều hơn một trong các định dạng có thể phù hợp với nó và nó sẽ không biết cái nào để deserialize. Nếu bạn có một số lớp học mà tất cả thực hiện IFoo và có một thể hiện của mỗi bên trong đối tượng dữ liệu thì yêu cầu IFoo sẽ không rõ ràng. Vì vậy, bạn phải yêu cầu loại chính xác đã được tuần tự hóa vào đối tượng dữ liệu.

Điều này có nghĩa là bạn không nên đặt các lớp vào đối tượng dữ liệu không thể được deserialized vì chúng là tư nhân ở đầu bên kia.