2010-09-21 32 views
0

我有一個用戶控件有多個狀態/模式的自定義屬性。如果此屬性在父頁面中設置:我想讓我的控件自動更新。在頁面加載中使用屬性不起作用,因爲它沒有啓動。覆蓋用戶控件上的DataBind,注意事項?

我能想象3種方法來做到這一點:

  1. 在屬性,我可以添加一個代碼塊,將調用this.DataBind()。
  2. 我可以通過覆蓋虛擬方法DataBind來添加代碼。
  3. 我可以創建一個公有的專有Update方法。

我想任何輸入到什麼是一般的最佳實踐。更重要的是,我選擇重寫虛擬方法DataBind。我的僞代碼是這樣的:

public override void DataBind() 
{ 
     if (SpecialMode) 
     { 
     .. load from database 

     } 
     base.DataBind() 
    } 

我對base.DataBind()的排序感興趣。我已經看到它通常放在第一位,但在我從數據庫中加載數據後:我需要數據綁定才能顯示數據。

任何輸入到這些考慮將不勝感激。

要清除:

此控件是一個投票控件。它通常會搜索並加載輪詢以顯示來自Page_Load事件。但是,它也有一個報告模式,允許嵌入控件的頁面更改要顯示的輪詢的ID。此屬性不會在Page_Load中啓動。好吧,這個混亂的一部分是我有一個對象的屬性,我也有一個重複的ViewState屬性,但只有Id。

回答

0

你可以讓你的用戶控制手柄在其PreRender事件自動綁定。當Id屬性發生變化時(或者是觸發自動數據綁定的屬性),您可以在控件中設置一個標誌,稍後在PreRender中檢查該標誌以指示需要加載數據。

或者,而不是設置一個標誌,你可能清楚,你已經從ViewState中加載和執行邏輯的PreRender說「如果沒有數據,然後加載」的任何數據。

這避免了可能是由於情況的單個請求那裏恰好是代碼多次設置Id屬性內加載數據多次。

+0

@DrWily謝謝,這是有道理的。我會等待看看是否有更多的建議。這其中的一些複雜性來自於我使用ViewState存儲狀態數據的事實,但僅僅是爲了方便,我還將對象存儲在屬性中,因此當Id更改其他屬性時應該更改。但第一次,我實際上是從完整的對象中加載Id。所以,除非需要,我真的不想加載完整的對象。我現在看到它有點亂。 – 2010-09-21 22:01:54

0

你的控制不應該依賴,以任何方式,在其中嵌入在頁面上。相反,在控件上有一個「AutoUpdate」屬性,並讓頁面設置它。該頁面還應設置屬性,告訴控件在設置AutoUpdate屬性時如何更新。

+0

@Saunders這就是我正在做的。我會補充澄清。 – 2010-09-21 21:06:40

+0

@Curtis:首先,使用用戶名的開頭,如「@John」。其次,你的控制應該不會自己加載數據。看看DataGrid控件如何實現它。另外,如果您不綁定數據,則不要使用DataBind方法。只要覆蓋OnPreRender或者Render,如果控件的輸出根據此屬性而不同。如果_data_根據屬性而不同,那麼頁面應該說明要使用哪些數據,而不是控件。 – 2010-09-21 21:17:33