2011-11-18 94 views
1

我想創建一個實現IPostBackDataHandler的標籤,因爲我想用javascript更改文本。如果我在此之後觸發回發,那麼比我的文本消失。創建一個實現IPostBackDataHandler的自定義標籤

,我已經擁有的代碼是這樣的:

public class CustomLabel : Label, IPostBackDataHandler 
{ 
    protected override void OnPreRender(EventArgs e) 
    { 
    base.OnPreRender(e); 

    if (Page != null) 
     Page.RegisterRequiresPostBack(this); 
    } 

    public bool LoadPostData(string postDataKey, System.Collections.Specialized.NameValueCollection postCollection) 
    { 
    this.Text = postCollection[postDataKey]; 
    return true; 
    } 

    public void RaisePostDataChangedEvent() 
    { 
    //throw new NotImplementedException(); 
    } 
} 

它不工作,我不明白我怎麼應該看到文本更改和PostCollection [postDataKey]總是空。

回答

1

IPostBackDataHandler接口用於輸入。像跨度和div這樣的元素不會被存儲在請求對象中。我只是實現必要的ViewState管理方法。下面是我開發的一個自定義網格組件的示例:

protected override void LoadViewState(object savedState) 
{ 
    if (savedState != null) 
    { 
     object[] state = (object[])savedState; 

     if (state[0] != null) 
      base.LoadViewState(state[0]); 
     if (state[1] != null) 
      ((IStateManager)ItemStyle).LoadViewState(state[1]); 
     if (state[2] != null) 
      ((IStateManager)headerStyle).LoadViewState(state[2]); 
     if (state[3] != null) 
      ((IStateManager)AlternatingItemStyle).LoadViewState(state[3]); 
    } 
} 

protected override object SaveViewState() 
{ 
    object[] state = new object[4]; 

    state[0] = base.SaveViewState(); 
    state[1] = itemStyle != null ? ((IStateManager)itemStyle).SaveViewState() : null; 
    state[2] = headerStyle != null ? ((IStateManager)headerStyle).SaveViewState() : null; 
    state[3] = alternatingItemStyle != null ? ((IStateManager)alternatingItemStyle).SaveViewState() : null; 

    return state; 
} 

protected override void TrackViewState() 
{ 
    base.TrackViewState(); 

    if (itemStyle != null) 
     ((IStateManager)itemStyle).TrackViewState(); 
    if (headerStyle != null) 
     ((IStateManager)headerStyle).TrackViewState(); 
    if (alternatingItemStyle != null) 
     ((IStateManager)alternatingItemStyle).TrackViewState(); 
} 
+0

謝謝,我以爲我能夠實現IPostBackDataHandler,但我錯誤地得到這個工作。我現在要使用一些隱藏的域。 – Marlou

+0

隱藏字段不會解決您的問題。您需要在視圖狀態下跟蹤控件。儘管你已經從Label控件繼承,所以它應該非常簡單。 –