在回发期间,selectedIndex丢失了 - ASP.NET

mma*_*tax 5 .net c# asp.net viewstate

我有一个列表框控件:


<asp:ListBox runat="server" id="lbox" autoPostBack="true" />

背后的代码类似于:


private void Page_Load(object sender, System.EventArgs e)
{
    lbox.SelectedIndexChanged+=new EventHandler(lbox_SelectedIndexChanged);
    if(!Page.IsPostBack)
    {
        LoadData();     
    }
}
private LoadData()
{
    lbox.DataSource = foo();
    lbox.DataBind();
}
protected void lboxScorecard_SelectedIndexChanged(object sender, EventArgs e)
{
    int index = (sender as ListBox).selectedIndex;
}

我的问题是,当我的页面收到回发帖子时(当用户在列表框中进行选择时),选择总是"跳转"到列表框中的第一个项目,因此我的回调函数中的索引变量始终为0.

这似乎可能是一个viewstate问题?如何修复它以便选择索引保留在回发中?

没有ajax,这是.NET 1.0.

谢谢.

编辑1 JohnIdol让我更近了一步,如果我将数据源从我原来的DataTable切换到ArrayList,那么一切正常......会导致什么?

编辑2事实证明我的DataTable有多个相同的值,因此索引被视为具有相同值的所有项目相同...感谢那些帮助过的人!

dav*_*owl 10

这里真正的问题是事件的顺序.当您在page_load中进行数据绑定时,会覆盖已发布的数据,这就是为什么未在列表框中设置选择的原因.您可以通过将绑定逻辑移动到Page_Init来轻松克服此问题.


Joh*_*dol 2

foo() 函数调用的输出是什么?

手动填充列表框,您可以将索引设置为您想要的任何内容(例如全 0) - 因此在某些情况下设置给定的数据源可能会发生同样的事情(我想是指定索引的情况)。如果所有项目索引均为 0,则结​​果是不会引发 SelectedIndexChanged 事件(索引不会更改!)并且一切都会混乱:在回发选择时将返回到列表中的第一项。

这可以解释它 - 我想不出其他任何东西 - 它在.NET 2.0上对我来说工作得很好我正在使用带有字符串的ArrayList来填充列表框。

我可以重现您的问题的唯一方法是将所有索引设置为 0。

我会说向列表框添加一个监视并在运行时检查索引以确保它们不全为零。