2008-10-01 20 views
5

Giả sử bạn có một số webparts, một là một bộ điều khiển và một số có thông tin từ bộ điều khiển và hành động trên nó. Điều này khá dễ dàng để mô hình hóa bằng cách sử dụng giao diện Người tiêu dùng/Nhà sản xuất được giới thiệu trong ASP 2.0.Sharepoint WebParts

Làm cách nào để bạn có thể thêm tương tác theo cách khác trong khi vẫn duy trì ở trên?

Ví dụ đơn giản là: người dùng nhập thông tin vào webpart A thực hiện tìm kiếm và kết quả sẽ được hiển thị trên webpart B. Webpart C cho phép bạn lọc kết quả sẽ kích hoạt webpart A để gửi lại truy vấn và do đó cập nhật các kết quả trong B.

Có vẻ như không thể thực hiện trong WSS 3.0 vì bạn chỉ được phép sử dụng 1 giao diện trong tất cả các kết nối tại một thời điểm.

Điều này thậm chí có ý nghĩa không? :-)

Trả lời

2

Một giải pháp nhanh chóng và bẩn để cho phép giao tiếp điều khiển tùy ý là sử dụng điều khiển tìm kiếm đệ quy và sự kiện. Có các điều khiển tìm kiếm cây điều khiển theo loại điều khiển cho những gì họ cần và sau đó đăng ký các sự kiện được hiển thị công khai trên điều khiển xuất bản.

Trước đây tôi đã sử dụng mẹo để bật các điều khiển máy chủ chuẩn để tìm thấy nhau khi được nhúng trong hệ thống CMS từ các nhà cung cấp khác nhau để tránh hoàn toàn một API giao tiếp cụ thể.

+0

hơi khó chịu: D –

1

Tôi không thấy điều gì sai với webpart A tham chiếu đến webpart B và gọi các phương thức/thuộc tính công khai/nội bộ hoặc xử lý đăng ký các sự kiện công khai/nội bộ. Một điểm được đề cập khi thực hiện điều này: EnsureChildControls. Tôi đã chứng kiến ​​bằng chính đôi mắt của mình một webpart được chạy rõ ràng với PreRender trong khi một webpart khác thậm chí không chạy CreateChildControls.

Từ webpart A, lấy bạn tham khảo để webpart B (trong trường hợp webpart này B là loại Lịch) như sau:

 private Calendar _calendarWP = null; 
    public Calendar CalendarWP 
    { 
     get 
     { 
      if (_calendarWP != null) 
       return _calendarWP; 
      else 
       foreach (System.Web.UI.WebControls.WebParts.WebPartZone zone in this.WebPartManager.Zones) 
        foreach (System.Web.UI.WebControls.WebParts.WebPart webpart in zone.WebParts) 
         if (webpart is Calendar) 
         { 
          _calendarWP = (Calendar)webpart; 
          _calendarWP.EnsureChildControls(); 
          return _calendarWP; 
         } 
      return null; 
     } 
    } 

Bây giờ bạn có thể làm những việc như lấy một số dữ liệu mới và cập nhật lịch như vậy:

  IEnumerable newData = SomeDataProvider.GetNewData(args); 
     CalendarWP.someGridView.DataSource = newData; 
     CalendarWP.someGridView.DataBind(); 

Hoặc có lẽ chúng ta hãy webpart một quăng một tham chiếu đến bản thân hơn để webpart B để nó có thể sử dụng webpart công cộng/nội bộ thuộc tính của một để đi lấy dữ liệu cho bản thân:

CalendarWP.UseWPAToFetchData(this); 
Các vấn đề liên quan