2010-02-26 87 views
1

我有一個使用兩個列表框和第三方控件(Fluent.ListTransfer)將值從一個列表轉移到另一個列表的ASP頁面。相當標準的東西:如何在用戶控件上維護視圖狀態

<td> 
    <asp:ListBox ID="ListBoxAvailable" Runat="server" 
     SelectionMode="Multiple" EnableViewState="true"> 
    </asp:ListBox> 
</td> 
<td style="vertical-align: middle"> 
    <a href="#" onclick="<%= ListTransfer1.ClientMoveSelected %>" ><img src="img/RightArrow.jpg" alt=">>"/></a> 
    <br /> 
    <a href="#" onclick="<%= ListTransfer1.ClientMoveBackSelected %>"><img src="img/LeftArrow.jpg" alt="<<"/></a> 

</td> 
<td> 
    <asp:ListBox ID="ListBoxSelected" Runat="server" 
     SelectionMode="Multiple" EnableViewState="true"> 
    </asp:ListBox> 
</td> 

在控件Page_Load事件,我設置了「可用」和「選擇」框的一些SQL內容:

protected void Page_Load(object sender, EventArgs e) 
    { 

     if (IsPostBack) 
      return; 

     // Some code to work through a recordset, adding values 
     // to the selected or available list boxes 

我認爲上回發,視圖狀態會照顧列表框的狀態,由用戶更改(畢竟,它們是標準的ASP控件)。但是,如果我做回發,這兩個列表框都是空白的。

在回發之間維護列表框狀態的正確方法是什麼?

感謝所有幫助

瑞安

回答

2

ViewState就像客戶端的「間諜」。每當客戶端發生變化時,ViewState將向服務器報告(讀取:回發)更改,以便服務器可以重新處理頁面。

不幸的是,如果我們使用客戶端腳本改變像ListBox這樣的控件的內容,ViewState不會看到它。

我猜你的Fluent.ListTransfer是一個客戶端功能。

一些解決方案:

列表框店在ViewState中唯一 所選擇的項目(我猜只有 指數),不是所有列表中的項目, 所以只知道恢復 所選項目,而不是整個列表。是 有點奇怪,但是邏輯。爲了 十個分量在ViewState中,你 可以寫信 列表框或HtmlSelect衍生一個新的ListBox中的所有項目,但你必須在同一時間 手柄使用 JavaScript代碼 可能性,即從列表 框中的項目在客戶端進行修改。


當頁面回沒有在列表框 項目被送回 服務器除那些 選擇的客戶端上。當你考慮它時,這使得 有意義。忘記 關於視圖狀態和所有其他。您 可以選擇多個項目,使所有 您添加到列表框2 選定的項目。


另一個解決這一點,但不能因此 優雅。基本想法是將 ONE LISTBOX上的所有項目記錄到 控件,並且每次使用控件的值 重新填充列表框 頁面被重新發回。希望 有人能想出一些更好的 :

  1. 將一個隱藏的輸入您的網頁。請記住將RUNAT = SERVER 屬性,以便您可以參考 您的輸入來自您的ASP.NET代碼 後面。

  2. 在你的JavaScript,只要更改一個列表框的內容, 串接所有值 - 使用 分離器 - 並把價值爲 你隱藏的輸入。

  3. 在您的Page_Load代碼中,將代碼讀取HIDDEN輸入, 將值分開,並填寫 列表框。

希望這一切都有助於...

+0

非常有幫助。謝謝! – Ryan 2010-02-26 11:55:22

0

如果我理解你的代碼正確您在客戶端從一個列表框移動listItems中的另一個。但ListBox不會提交他們的全部內容 - 只有選定的項目。所以必須保持這一點。我不知道,如果Fluent.ListTransfer會爲你做。