ASP.NET DropDownList在SelectedIndexChanged事件中未绑定SQL数据
解决DropDownList联动无数据更新的问题
我帮你排查下代码里的几个关键问题,这些应该就是导致DropDownList2没正常显示数据的原因:
问题1:SQL参数被错误解析为字符串字面量
你写的SQL语句里,把@ShipMake用单引号包起来了,这会让SQL把它当成普通字符串,而不是参数来匹配查询条件,自然查不到对应的数据。要去掉单引号:
String str2 = "SELECT DISTINCT [Ship Model] FROM ShipMatrix WHERE ([Ship Make] = @ShipMake)";
问题2:多余的ExecuteNonQuery()调用
ExecuteNonQuery()是用来执行增、删、改这类不返回结果集的操作的,你这里是查询数据,完全不需要调用它——直接用DataAdapter填充数据就行,这一步多余还可能干扰后续逻辑。
问题3:参数传递和控件值获取的细节问题
- 添加参数时最好带
@前缀,和SQL里的参数名严格保持一致; - 获取DropDownList的选中值,用
SelectedValue比Text更可靠,尤其是当DataTextField和DataValueField不同的时候:
qry2.Parameters.Add("@ShipMake", SqlDbType.VarChar).Value = DropDownList1.SelectedValue;
问题4:未确认AutoPostBack属性
别忘了检查DropDownList1的AutoPostBack属性是否设置为true,如果是false的话,选中值变化时不会触发服务器端的SelectedIndexChanged事件,自然不会执行更新逻辑。
优化后的完整代码
另外,建议用using语句管理数据库连接和命令,避免连接泄漏:
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e) { // 确保DropDownList1有选中值再执行 if (string.IsNullOrEmpty(DropDownList1.SelectedValue)) return; string str2 = "SELECT DISTINCT [Ship Model] FROM ShipMatrix WHERE ([Ship Make] = @ShipMake)"; using (SqlConnection conn = new SqlConnection(Xebon.ConnectionString)) // 替换成你的连接字符串获取方式 using (SqlCommand qry2 = new SqlCommand(str2, conn)) { qry2.Parameters.Add("@ShipMake", SqlDbType.VarChar).Value = DropDownList1.SelectedValue; conn.Open(); SqlDataAdapter sda2 = new SqlDataAdapter(qry2); DataTable ds2 = new DataTable(); sda2.Fill(ds2); DropDownList2.DataSource = ds2; DropDownList2.DataTextField = "Ship Model"; DropDownList2.DataValueField = "Ship Model"; DropDownList2.DataBind(); // 不需要手动Close,using会自动释放连接 } }
按照上面的修改后,应该就能正常联动更新DropDownList2的选项了。
内容的提问来源于stack exchange,提问作者mjc4wilton
相关产品推荐
相关产品推荐

