You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ListBox选中索引始终返回-1问题排查求助

问题原因与解决方案

这是ASP.NET开发中很常见的回发状态丢失问题,我来帮你梳理下核心原因和解决办法:

问题根源

ASP.NET页面每次触发回发(比如按钮点击)时,Page_Load方法都会优先于按钮点击事件执行。你当前的代码不管页面是首次加载还是回发,都会重新从数据库拉取数据并绑定ListBox——这会直接重置ListBox的所有状态,包括用户之前选中的项,所以SelectedIndex始终返回-1。

解决步骤

1. 修改Page_Load,添加回发判断

只在页面首次加载(非回发)时执行数据绑定,回发时跳过绑定,保留用户的选中状态:

protected void Page_Load(object sender, EventArgs e)
{
    // 仅当页面第一次加载时才绑定数据
    if (!IsPostBack)
    {
        String Sql = @" select * from project";
        SqlConnection conn = new SqlConnection(Properties.Resources.cString);
        SqlDataAdapter DA = new SqlDataAdapter(Sql, Properties.Resources.cString);
        DataSet DS = new DataSet();
        DA.Fill(DS, "Project");
        DataTable DT = DS.Tables["Project"];
        lbProjects.DataValueField = "ProjectID";
        lbProjects.DataTextField = "ProjectName";
        lbProjects.DataSource = DT;
        lbProjects.DataBind();
    }
}

2. 优化选中项获取代码

你原本的代码可以简化,不用多余的类型转换,直接判断SelectedIndex是否有效即可:

protected void YourButton_Click(object sender, EventArgs e)
{
    if (lbProjects.SelectedIndex != -1)
    {
        // 直接获取选中项的Value(就是你绑定的ProjectID)
        string number = lbProjects.SelectedValue;
        // 如果需要转成int类型
        int projectId = Convert.ToInt32(number);
        // 后续业务逻辑...
    }
    else
    {
        // 处理用户未选中任何项的情况
    }
}

这里用SelectedValue比通过Items[SelectedIndex].Value更简洁直接,因为你已经设置了DataValueField为ProjectID。

额外小提示

数据库操作部分可以用using语句自动释放连接资源,避免内存泄漏:

using (SqlConnection conn = new SqlConnection(Properties.Resources.cString))
{
    String Sql = @" select * from project";
    SqlDataAdapter DA = new SqlDataAdapter(Sql, conn);
    DataSet DS = new DataSet();
    DA.Fill(DS, "Project");
    // 后续绑定逻辑...
}

内容的提问来源于stack exchange,提问作者Jack Henry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:52:21