ASP.NET填充在选定索引更改时相互引用的列表
本文关键字:引用 列表 填充 NET 索引 ASP | 更新日期: 2023-09-27 18:29:36
我有一个带有三个列表框的ASP.NET控件:LBParent
、LBChild1
和LBChild2
。
LBParent
必须以编程方式填充。我在Page_Load
中这样做。
当用户在LBParent
中选择一个值时,我希望以编程方式用一些数据填充LBChild1
和LBChild2
。子列表还必须跟踪其选定的值。
基本上,父列表是一个用户列表,第一个列表是用户拥有的权限列表,第二个列表是该用户没有的权限列表。
我的计划是添加两个按钮来在两个列表之间移动权限。
不幸的是,我无法正常工作。
-
如果我在
Page_Load
中填充父列表,则所选索引似乎会重置。我用ViewState
保存索引。。。但这似乎需要额外的刷新,因为它在PostBack之后不会更新。这是不可接受的。 -
如果我在
OnParentSIC
事件上填充子列表框,我就无法跟踪他们选择的索引。OnChildXSIC
事件永远不会激发,因为列表框会"过快"重新填充。(?)
如何使其按预期工作也许有更好的解决方案,但我真的很想了解如何让这个解决方案发挥作用,因为我目前还看不到可能的解决方案。
Control.ascx
<%@ Control Language="C#" AutoEventWireup="true" EnableViewState="True" CodeBehind="..." Inherits="..." %>
<form runat="server">
<asp:ListBox ID="LBParent" runat="server" CssClass="form-control"
AutoPostBack="true" OnSelectedIndexChanged="OnParentSIC" />
<asp:ListBox ID="LBChild1" runat="server" CssClass="form-control"
AutoPostBack="true" OnSelectedIndexChanged="OnChild1SIC" />
<asp:ListBox ID="LBChild2" runat="server" CssClass="form-control"
AutoPostBack="true" OnSelectedIndexChanged="OnChild2SIC" />
</form>
Control.ascx.cs
protected void Page_Load(object sender, EventArgs e)
{
// Populate parent
for(...) LBParent.Items.Add(...);
}
Onchange事件会触发,但在此之前会触发OnLoad。因此:
- 用户单击所选内容
- 触发回发
- 在服务器上,Onload启动(并重建列表)
- OnSelectedIndexChanged触发(现在已丢失选择)
因此,在重新生成列表(在Onload中)之前,我会尝试保存当前选定的索引。
如果以后在同一个"回发"中还原它,则可以将其保存在一个简单变量中。无需存储在Viewstate或Session中。
像这样使用
如果您在同一页面上,则可以使用ViewState
/Hidden Fields
维护各州
第一次在PageLoad上添加ListItem像这样使用
protected void Page_Load(object sender, EventArgs e)
{
if(!Page.IsPostBack)
{
AddListItems();
}
}
Protected Void AddListItems()
{
// Populate parent
for(...) LBParent.Items.Add(...);
for(...) SecondList.Items.Add(...);
for(...) ThirdList.Items.Add(...);
}