2010-03-26 73 views
5

在我的頁面上,我有n-userControls(相同的控件),我需要在它們之間進行通信(更具體地說,我需要傳遞一個值)。在用戶控件之間共享數據

我不想涉及託管頁面。

這些控件充當「傳呼機」,並通過託管頁面訂閱的事件與主機頁面上的分頁數據進行交互。
所以當用戶點擊其中一臺尋呼機並改變它的狀態時,另一個控制器應該知道它並相應地改變它自己。

我不能使用VieState,因爲viewstate是每個控件,控制狀態也是如此。

我可以使用Session嗎? (會話是共享的,只有一個值,我需要存儲)

或者有更好的東西我可以使用? (無查詢字符串)

回答

1

個人而言,沒有通過控制頁面或事件執行此操作的「簡單」方法。

從你在說什麼,我會設想會是這樣的。假設兩個控件A和B是你的尋呼控件。

包含頁面訂閱兩個控件上的「PageSelectionChanged」事件,作爲對該事件的響應,它更新您已擁有的數據,並通過所有頁面控件枚舉設置「當前頁面」值來枚舉。

你已經有了控制 - >頁面進行通信的事件管道,使用你已經構建的內容。

爲什麼不會話?

我在評論中被問及這是否會比會議更好,答案是肯定的,原因有很多。

  1. 會話信息,除非明確清理存在的用戶會話的持續時間(通常是20分鐘)
  2. 數1 becase的,你需要將項目添加到頁面上,如果(!的IsPostBack)以「清除」會話變量,以便用戶不會在其他頁面上啓動。
  3. 未來的應用程序增長,會話信息必須被移出到SQL Server或以其他方式在Web服務器場環境中工作,爲此我儘量避免使用它。
  4. 使用會話存儲在Web服務器上存儲這些信息,雖然小(4個字節,如果整數),它可以加起來是聯合國必要
  5. 根據您的更新的性質,就不能確保單獨的會話控制命令確保1控件強制更新所有控件。

還有其他解決方案,類似於上面發佈的解決方案的遞歸查看頁面,但您必須小心以確保您不會陷入循環/無限遞歸情況另外,如果頁面上有很多控件,它可能會增加很多開銷,以便不斷循環所有內容。

+0

是這會工作,但這需要更多的代碼,我需要在主機頁面中添加(目前,該事件訂閱託管頁面不與控件交互旁),將通過控制requre循環並在頁面上找到它們。是否更好,然後保存整數會議,所以兩個控件都可以讀取? – toraan 2010-03-26 21:35:58

+0

是的,看到我的這篇文章的更新爲什麼(太長的評論) – 2010-03-26 21:38:22

+0

如此循環的託管頁面(我需要找到我的網頁上的所有用戶控件)usercontrols是我的方案中的最佳選擇? – toraan 2010-03-26 21:54:48

0

容器頁面在viewstate中有一個存儲狀態的屬性。當用戶點擊其中一臺尋呼機時,它會引發一個由容器頁面處理的事件。然後循環遍歷n個用戶控件並在這些控件上調用公共方法。

0

您可以構建觀察者模式的快速修改版本。我會建議在頁面上建立一個管理員控制。但是如果你不想修改頁面,這是一個快速解決方案。

您可以創建一個靜態方法來通知所有相同類型的控件。通過調用它們的更新方法。隨時通過你需要的數據。

protected void control_event(object sender, EventArgs e) 
{ 
    UpdateAllControls(page); 
} 


public static void UpdateAllControls(Control parent /* can be Page */) 
     { 
      foreach (Control c in parent.Controls) 
      { 
       if (c.GetType() == this.GetType()) 
        ((MyType)).Update() 
       if (c.HasControls()) 
        controls = GetAllControls(controls, t, c); 
      } 
     } 
+0

這個解決方案可行,但是如果不是必要的話,我會提醒注意不要遞歸。如果你有很多控制,這可能是一個昂貴的過程。如果用戶控件始終只添加到頁面中,則跳過該過程的遞歸部分。 – 2010-03-26 21:44:15

+0

這是假設你不知道頁面是如何設置的。是的,我同意,這是一個緩慢的方法。用Observer註冊每個控件將是最佳解決方案。 – Glennular 2010-03-26 21:51:46

+0

上面的代碼如何與觀察者不同? – toraan 2010-03-26 22:33:40