解决asp:GridView通过ListBox多选过滤仅显示初始选择数据的问题
解决ListBox多选过滤GridView数据的问题
你的问题核心在于当前代码只处理了ListBox的单个选中项,没有适配多选场景,同时存储过程也只支持单个值的过滤。下面分步骤修改代码来实现多选功能:
1. 修改DropDownChange事件:收集所有选中项
原来的代码只取了SelectedItem.Value,这只会拿到第一个选中项。我们需要遍历所有选中的项,把它们的值拼接成逗号分隔的字符串,再存入ViewState:
protected void DropDownChange(object sender, EventArgs e) { ListBox dropdown = (ListBox)sender; // 收集所有选中项的值,用逗号分隔 string selectedValues = string.Join(",", dropdown.Items.Cast<ListItem>().Where(item => item.Selected).Select(item => item.Value)); switch (dropdown.ID.ToLower()) { case "ddlstatus": // 保存多选值到ViewState,没有选中项时存"0" ViewState["stat"] = string.IsNullOrEmpty(selectedValues) ? "0" : selectedValues; break; } this.BindGrid(); }
2. 修改BindGrid方法:传递多选参数并适配存储过程
现在要把拼接好的多选字符串传递给存储过程,同时注意如果没有选中项(值为"0"),要设置为null让存储过程返回所有数据:
private void BindGrid() { DataTable dt = new DataTable(); String strConnString = System.Configuration.ConfigurationManager.ConnectionStrings["connStr"].ConnectionString; MySqlConnection con = new MySqlConnection(strConnString); MySqlDataAdapter sda = new MySqlDataAdapter(); MySqlCommand cmd = new MySqlCommand("GetTMData"); cmd.CommandType = CommandType.StoredProcedure; string statusVal = null; if (ViewState["stat"] != null && ViewState["stat"].ToString() != "0") { statusVal = ViewState["stat"].ToString(); } cmd.Parameters.AddWithValue("statusVal", statusVal); cmd.Connection = con; sda.SelectCommand = cmd; sda.Fill(dt); gdvTM.DataSource = dt; gdvTM.DataBind(); this.BindDropDownList(); // 更新选中项的方法,适配多选场景 setDropdownselectedItems(ViewState["stat"] != null ? (string)ViewState["stat"] : string.Empty, ddlstatus); }
3. 修改存储过程:支持多选值过滤
原来的存储过程只处理单个值,现在用MySQL的FIND_IN_SET函数来处理逗号分隔的多个值:
CREATE DEFINER=`root`@`localhost` PROCEDURE `GetTMData`(in statusVal varchar(255)) -- 加大参数长度,容纳多个值 BEGIN SELECT * FROM approved WHERE (statusVal IS NULL OR FIND_IN_SET(status, statusVal) > 0) order by date desc; END
注意:如果
status字段的值本身包含逗号,这种方法会失效,这时建议用表值参数或者其他方式,但大部分业务场景下逗号分隔的方式足够适用。
4. 修改选中项绑定方法:支持多选设置
原来的setDropdownselectedItem只设置单个项,现在改成遍历所有选中值,逐个设置选中状态:
private void setDropdownselectedItems(string selectedValues, ListBox ddl) { if (!string.IsNullOrEmpty(selectedValues) && selectedValues != "0") { // 拆分选中值数组 string[] values = selectedValues.Split(','); foreach (string val in values) { ListItem item = ddl.Items.FindByValue(val); if (item != null) { item.Selected = true; } } } else { // 没有选中项时,默认选中"Please select" ddl.Items.FindByValue("0").Selected = true; } }
额外注意点
- 确保ListBox的
SelectionMode="Multiple"已经正确设置(你的代码里已经配置,无需改动) - 如果
status字段是数值类型,要注意参数和字段的类型匹配,避免类型转换错误 - 可以对拼接的选中值做合法性校验(因为值来自绑定的ListBox,相对安全,但校验能进一步避免潜在问题)
内容的提问来源于stack exchange,提问作者prkash
相关产品推荐
相关产品推荐

