使用表头下拉筛选GridView时出现SelectedIndexChanged DataBind错误
这个错误我之前排查过不少次,本质就是你的代码在试图访问当前数据源(DataRowView)里根本不存在的列名,而且这个列还不是你预期用来筛选的STATUS,大概率是以下几个地方出了问题,你可以逐一排查:
筛选表达式里写错了列名
这是最常见的原因——你在构建RowFilter筛选条件的时候,不小心把STATUS写成了那个报错的[AnotherColumnThatIsNotSTATUS],可能是复制粘贴时的手误,或者变量名写错了。比如如果你的代码里有类似dv.RowFilter = "[WrongColumn] = '" + ddlStatusHeader.SelectedValue + "'"的语句,肯定会触发这个错误。
检查你的筛选逻辑,确保RowFilter里用的是正确的STATUS列名,而且要和数据源(比如DataTable)里的列名完全匹配(注意大小写,虽然DataTable列名默认不区分大小写,但严格匹配能避免很多坑)。表头下拉列表的绑定配置有误
如果你是动态绑定下拉列表的选项,可能不小心把DataTextField或者DataValueField设置成了那个不存在的列。比如本来应该写ddlStatusHeader.DataValueField = "STATUS";,结果写成了错误的列名,导致筛选时传递了错误的字段标识。
检查下拉列表的绑定代码,确保绑定的字段是STATUS,而且这个字段确实存在于下拉列表的数据源中。GridView的列绑定引用了错误列
有时候问题不一定出在筛选逻辑里,而是GridView本身的列配置有问题。如果GridView里有某个绑定列的DataField设成了那个报错的列名,哪怕你没在筛选里用到它,在数据绑定的时候也会触发这个错误。
打开GridView的设计视图或者后台代码,检查所有列的DataField属性,确保每个字段都存在于你绑定的数据源中。数据源结构发生了变化
如果你最近修改过获取数据的SQL语句、存储过程,或者数据源的结构,可能导致返回的结果集里根本没有那个报错的列,但你的代码还在硬编码引用它。这种情况只要核对数据源的返回字段和代码里的引用是否一致就能发现。
修正后的代码示例
这里给你一个正确的筛选逻辑示例,你可以对比自己的代码调整:
protected void ddlStatusHeader_SelectedIndexChanged(object sender, EventArgs e) { DropDownList ddlStatusHeader = ((DropDownList)sender); string CS = ConfigurationManager.ConnectionStrings["YourConnString"].ConnectionString; using (SqlConnection con = new SqlConnection(CS)) { // 假设你的SQL语句返回包含STATUS列的结果集 SqlCommand cmd = new SqlCommand("SELECT ID, Name, STATUS FROM YourTargetTable", con); con.Open(); DataTable dt = new DataTable(); dt.Load(cmd.ExecuteReader()); DataView dv = dt.DefaultView; // 只在选择了具体状态时应用筛选 if (!string.IsNullOrEmpty(ddlStatusHeader.SelectedValue) && ddlStatusHeader.SelectedValue != "全部") { // 确保这里用的是正确的STATUS列名 dv.RowFilter = "STATUS = '" + ddlStatusHeader.SelectedValue + "'"; } GridView1.DataSource = dv; GridView1.DataBind(); } }
另外提个小建议:直接拼接字符串到RowFilter有注入风险,你可以用参数化的方式处理,比如:
dv.RowFilter = "STATUS = @Status"; dv.RowFilterParameters.Add("@Status", ddlStatusHeader.SelectedValue);
内容的提问来源于stack exchange,提问作者Nils

