我有一个列表框控件:
<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;}
我的问题是,当页面收到回发消息时(当用户在列表框中进行选择时),选择始终会“跳转”到列表框中的第一项,因此回调函数中的index变量始终为0。

好像这样可能是viewstate问题?我该如何解决它,以便选择索引通过回发保留?

没有ajax发生,这是.NET 1.0。

谢谢。

编辑1 JohnIdol使我更加接近了,如果我将数据源从原始DataTable切换到ArrayList,那么一切都会正常工作……是什么原因引起的?

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

最佳答案

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

手动填充列表框,您可以将索引设置为所需的任何值(例如全为0)-因此在某些情况下(给定我假设指定索引的情况)设置给定的dataSource可能发生相同的情况。如果所有项目索引均为0,则结果是不会引发SelectedIndexChanged事件(索引不会更改!),并且一切都搞砸了:回发后选择将返回列表中的第一项。

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

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

我想说的是,将一个 watch 添加到ListBox并在运行时检查索引,以确保它们不全为零。

关于c# - 回发过程中selectedIndex丢失-ASP.NET,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/338472/

10-12 20:58