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

解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:14:09