如何让GridView向后台代码传递变量?多控件共享数据源场景
实现同一个RowDataBound函数处理多GridView的差异化过滤
当然可以实现!你只需要给每个GridView传递专属的过滤参数,在通用的RowDataBound函数里读取这个参数,再对应过滤数据就行。下面给你几种实用的方案:
方案一:使用自定义HTML属性(推荐)
这种方法最灵活,新增GridView时不用修改后台代码,只需在前端配置参数即可。
1. ASPX页面配置GridView
给每个GridView添加一个data-subject-id属性,指定对应的过滤值:
<asp:GridView ID="GridViewEng" runat="server" OnRowDataBound="Common_GridViewRowDataBound" data-subject-id="1" DataSourceID="repeaterdata"> <!-- 列配置 --> </asp:GridView> <asp:GridView ID="GridViewMath" runat="server" OnRowDataBound="Common_GridViewRowDataBound" data-subject-id="2" DataSourceID="repeaterdata"> <!-- 列配置 --> </asp:GridView> <asp:GridView ID="GridViewSci" runat="server" OnRowDataBound="Common_GridViewRowDataBound" data-subject-id="3" DataSourceID="repeaterdata"> <!-- 列配置 --> </asp:GridView>
2. 后台通用RowDataBound函数
从触发事件的GridView对象中读取自定义属性,再进行过滤:
protected void Common_GridViewRowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { // 获取当前触发事件的GridView GridView currentGrid = (GridView)sender; // 读取自定义属性的过滤值 string targetSubjectId = currentGrid.Attributes["data-subject-id"]; if (string.IsNullOrEmpty(targetSubjectId)) { // 如果没有配置参数,默认显示所有行或者隐藏,根据需求调整 e.Row.Visible = true; return; } DataRowView drv = (DataRowView)e.Row.DataItem; // 对比Subject_Id,控制行可见性 e.Row.Visible = drv["Subject_Id"].ToString() == targetSubjectId; } }
方案二:使用GridView的Tag属性
如果不想用HTML自定义属性,也可以用ASP.NET控件自带的Tag属性来存储参数:
1. ASPX配置
<asp:GridView ID="GridViewEng" runat="server" OnRowDataBound="Common_GridViewRowDataBound" Tag="1" DataSourceID="repeaterdata"> <!-- 列配置 --> </asp:GridView>
2. 后台读取参数
只需把方案一中读取属性的代码改成:
string targetSubjectId = currentGrid.Tag.ToString();
方案三:通过GridView的ID区分(不推荐,硬编码)
如果你的GridView数量固定且不会新增,可以直接通过判断ID来分配过滤值,但这种方法扩展性差,不推荐长期使用:
protected void Common_GridViewRowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { GridView currentGrid = (GridView)sender; string targetSubjectId = string.Empty; switch(currentGrid.ID) { case "GridViewEng": targetSubjectId = "1"; break; case "GridViewMath": targetSubjectId = "2"; break; case "GridViewSci": targetSubjectId = "3"; break; default: targetSubjectId = string.Empty; break; } if (!string.IsNullOrEmpty(targetSubjectId)) { DataRowView drv = (DataRowView)e.Row.DataItem; e.Row.Visible = drv["Subject_Id"].ToString() == targetSubjectId; } } }
额外建议
其实从性能角度考虑,直接在数据源层面过滤会更高效(比如每个GridView绑定带参数的SqlDataSource),不过如果你的业务场景必须在RowDataBound里处理,上面的方案完全可以满足需求。
内容的提问来源于stack exchange,提问作者SANM2009
相关产品推荐
相关产品推荐

