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

C# ASP.NET填充在选定索引更改时相互引用的列表,c#,asp.net,listbox,postback,autopostback,C#,Asp.net,Listbox,Postback,Autopostback,我有一个ASP.NET控件,它有三个列表框:LBParent、LBChild1和LBChild2 LBParent必须以编程方式填充。我在页面加载中执行此操作 当用户在LBParent中选择一个值时,我希望以编程方式用一些数据填充LBChild1和LBChild2。子列表还必须跟踪其选定的值 基本上,父列表是一个用户列表,第一个列表是用户拥有的权限列表,第二个列表是用户没有的权限列表 我的计划是添加两个按钮,在两个列表之间移动权限 不幸的是,我无法让它正常工作 如果我在页面加载中填充父列表,则

我有一个ASP.NET控件,它有三个列表框:
LBParent
LBChild1
LBChild2

LBParent
必须以编程方式填充。我在
页面加载中执行此操作

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

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

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

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

  • 如果我在
    页面加载
    中填充父列表,则所选索引似乎会重置。我使用
    ViewState
    保存索引。。。但这似乎需要额外的刷新,因为回发后它不会更新。这是不能接受的

  • 如果我在
    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>
像这样使用

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(...);
}
如果您在同一页面上,则可以使用
ViewState
/
隐藏字段
维护国家

第一次在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(...);
}

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

  • 用户单击所选内容
  • 将触发回发
  • 在服务器上,Onload触发(并重建列表)
  • OnSelectedIndexChanged激发(现在已丢失选择)
  • 因此,在重建列表(在Onload中)之前,我会尝试保存当前选定的索引


    如果稍后在相同的“回发”中恢复它,则可以将其保存在一个简单变量中。无需存储在Viewstate或会话中。

    我使用Viewstate保存索引。。。但这似乎需要额外的刷新
    how??你能帮我发一下密码吗this@Ganesh_Devlekar:基本上,在SelectedIndex上,更改了事件,如
    OnParentSIC
    I只调用了
    ViewState[“parentIdx”]=LBParent.SelectedIndex。当触发此事件时,它会在填充列表后发生,因此需要额外的页面刷新。如果我将列表填充代码放入
    Page\u LoadComplete
    ,则事件根本不会触发。请粘贴您尝试的所有代码。如果我这样做,所有列表在回发时都会被清除。这些项目没有维护。@VittorioRomeo请发布您的全部代码,最好找到问题所在