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
相关产品推荐
相关产品推荐

