我有一个ASP页面,它使用两个列表框和第三方控件(Fluent.ListTransfer)将值从一个列表传输到另一个列表。相当标准的东西:
<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>
在Controls Page_load事件中,我使用一些sql设置'available'和'selected'框的内容:
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控件)。但是,如果我进行回发,两个列表框都是空白的。
在回发之间维护列表框状态的正确方法是什么?
感谢您的帮助
赖安
答案 0 :(得分:2)
ViewState就像是客户端的“间谍”。只要客户端发生更改,ViewState就会向服务器报告(读取:PostBack)更改,以便服务器可以重新处理页面。
不幸的是,如果我们使用客户端脚本更改像ListBox这样的控件的内容,ViewState就看不到它。
我猜你的Fluent.ListTransfer
是客户端功能。
一些解决方案:
仅在ViewState中存储列表框 所选项目(我猜只有 index),而不是列表中的所有项目, 所以它只知道恢复 选中的项目,而不是整个列表。是 有点奇怪,但是逻辑。至 在ViewState中保存所有项目 可以编写一个新的ListBox派生自 ListBox或HtmlSelect,但你必须 处理的同时 列表中的项目的可能性 框在客户端使用修改 javascript代码。
当一个页面没有回复时 列表框中的项目将被发送回 服务器除了那些 在客户端上选择。这使得 当你想到它时感觉到。忘记 关于viewstate和所有其他的。您 可以选择多个项目,所以全部 您添加到列表框2的项目 地选择。
另一种解决方法,但不是这样 优雅。基本的想法是记录 一个LISTBOX上的所有项目 控制,并重新填充列表框 每次使用控件的值 正在发布的页面。希望 有人可以拿出一些东西 更好:
在您的网页中输入HIDDEN输入。记得放RUNAT = SERVER 属性,以便您可以参考 您从ASP.NET代码输入的内容 后面。
在您的Javascript中,每当您更改一个列表框的内容时, 连接所有值 - 使用a separator - 并将值放入 你的隐藏输入。
- 醇>
在Page_Load代码中,输入代码以读取HIDDEN输入, 将值分开,并填写 列表框。
希望这一切都有帮助...
答案 1 :(得分:0)
如果我正确理解您的代码,您将客户端的ListItem从一个ListBox移动到另一个ListBox。但ListBoxes不提交他们的全部内容 - 只提交选定的项目。所以你必须保持这一点。我不知道,如果Fluent.ListTransfer会为你做这件事。