ASP C#如何用单一数据源按列值过滤展示数据到10个GridView?
嘿,针对你要把单表数据按颜色过滤到10个GridView的需求,我给你几个比现有方案更优的实现思路,既能减少代码冗余,还能提升性能~
方案1:一次性加载全量数据,分视图绑定(最推荐)
这个思路的核心是只访问一次数据库,把所有数据拿到内存里,再给每个GridView绑定对应颜色的过滤后数据集,完美解决重复代码和多次数据库请求的问题。
示例代码(VB.NET)
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load If Not IsPostBack Then ' 一次性获取所有数据到DataTable Dim fullData As DataTable = FetchAllColourRecords() ' 用字典存颜色和对应GridView的映射,避免重复写绑定代码 Dim colourGridPairs As New Dictionary(Of String, GridView) From { {"pink", gvPink}, {"blue", gvBlue}, {"red", gvRed}, {"yellow", gvYellow}, ' ... 剩下6个颜色和GridView的映射 } ' 循环绑定每个GridView For Each pair In colourGridPairs ' 用DataView的RowFilter过滤指定颜色 Dim filteredView As New DataView(fullData) filteredView.RowFilter = $"colour = '{pair.Key}'" pair.Value.DataSource = filteredView pair.Value.DataBind() Next End If End Sub ' 封装数据库查询逻辑 Private Function FetchAllColourRecords() As DataTable Dim connString As String = ConfigurationManager.ConnectionStrings("YourDBConn").ConnectionString Using conn As New SqlConnection(connString) Dim query As String = "SELECT * FROM YourTargetTable" Using cmd As New SqlCommand(query, conn) conn.Open() Dim adapter As New SqlDataAdapter(cmd) Dim resultTable As New DataTable() adapter.Fill(resultTable) Return resultTable End Using End Using End Function
优势
- 仅1次数据库请求,大幅降低服务器和数据库的开销
- 代码通过循环批量处理,几乎没有冗余
- 每个GridView只加载对应颜色的数据,页面渲染更高效(对比RowDataBound隐藏行的方案,不会加载冗余数据)
方案2:自定义可复用的颜色GridView控件
如果10个GridView的结构完全一致,还可以把绑定逻辑封装成自定义控件,后续扩展新颜色的GridView会非常方便。
自定义控件核心代码
Public Class ColourFilteredGridView Inherits GridView ' 暴露一个属性,用来设置要过滤的颜色 Public Property TargetColour As String Protected Overrides Sub OnDataBinding(e As EventArgs) MyBase.OnDataBinding(e) ' 复用上面的FetchAllColourRecords方法获取全量数据 Dim fullData As DataTable = FetchAllColourRecords() Dim filteredView As New DataView(fullData) filteredView.RowFilter = $"colour = '{TargetColour}'" Me.DataSource = filteredView Me.DataBind() End Sub ' 这里可以把FetchAllColourRecords做成共享方法,或者从公共类调用 Private Function FetchAllColourRecords() As DataTable ' ... 同方案1的数据库查询逻辑 End Function End Class
页面上使用自定义控件
<uc:ColourFilteredGridView ID="gvPink" runat="server" TargetColour="pink" /> <uc:ColourFilteredGridView ID="gvBlue" runat="server" TargetColour="blue" /> <!-- 其他颜色的控件直接复制修改TargetColour即可 -->
优势
- 彻底实现代码复用,新增颜色只需要加一行控件代码
- 逻辑封装在控件内部,页面后台代码非常简洁
方案3:优化原有SqlDataSource方案(适合简单场景)
如果你还是想沿用SqlDataSource,可以通过批量修改过滤条件来减少冗余代码,但要注意:默认情况下SqlDataSource每次DataBind都会重新查询数据库,所以这个方案会产生10次数据库请求,性能不如方案1。
示例代码
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load If Not IsPostBack Then Dim colourGridPairs As New Dictionary(Of String, GridView) From { {"pink", gvPink}, {"blue", gvBlue}, ' ... 其他颜色映射 } For Each pair In colourGridPairs ' 修改SqlDataSource的过滤表达式 SqlDataSource1.FilterExpression = $"colour = '{pair.Key}'" ' 绑定到对应GridView pair.Value.DataSource = SqlDataSource1 pair.Value.DataBind() Next End If End Sub
注意
记得把SqlDataSource的SelectCommand设置为查询全量数据,不要带WHERE条件,靠FilterExpression来过滤。
对比你之前提到的RowDataBound隐藏行方案:那个方案会给每个GridView加载全量数据,再隐藏不符合的行,不仅浪费数据库请求,还会让页面加载冗余的DOM元素,数据量大的时候性能会很差,所以更推荐上面的方案1或方案2。
内容的提问来源于stack exchange,提问作者SANM2009
相关产品推荐
相关产品推荐

