ASP.NET填充在选定索引更改时相互引用的列表

本文关键字:引用 列表 填充 NET 索引 ASP | 更新日期: 2023-09-27 18:29:36

我有一个带有三个列表框的ASP.NET控件:LBParentLBChild1LBChild2

LBParent必须以编程方式填充。我在Page_Load中这样做。

当用户在LBParent中选择一个值时,我希望以编程方式用一些数据填充LBChild1LBChild2。子列表还必须跟踪其选定的值。

基本上,父列表是一个用户列表,第一个列表是用户拥有的权限列表,第二个列表是该用户没有的权限列表。

我的计划是添加两个按钮来在两个列表之间移动权限。

不幸的是,我无法正常工作。

  • 如果我在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(...);
}

ASP.NET填充在选定索引更改时相互引用的列表

Onchange事件会触发,但在此之前会触发OnLoad。因此:

  1. 用户单击所选内容
  2. 触发回发
  3. 在服务器上,Onload启动(并重建列表)
  4. 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(...);
}