如何从后台代码向Telerik RadGrid添加行?(附场景示例)
问题分析与解决方案
原代码的核心问题
你当前的写法存在两个关键问题:
- 计数变量
Red/Orange/Yellow/Green是在ItemDataBound事件的每一行绑定过程中重新初始化的,每次处理一行都会把计数清零,根本统计不了所有行的总数。 ItemDataBound是逐行触发的事件,适合处理单行的样式或逻辑,但不适合做全局数据汇总统计。
正确实现方式
应该在rg_SystemExp的DataBound事件中完成统计(这个事件是整个网格绑定完成后触发的,能拿到所有行数据),然后构造数据源绑定给rg_StatusCounts,不需要在rg_StatusCounts的ItemDataBound里额外处理。
修改后的完整代码
' 处理rg_SystemExp的DataBound事件,统计全局总数 Protected Sub rg_SystemExp_DataBound(ByVal s As Object, ByVal e As EventArgs) Handles rg_SystemExp.DataBound Dim Red As Integer = 0 Dim Orange As Integer = 0 Dim Yellow As Integer = 0 Dim Green As Integer = 0 ' 遍历所有数据行,统计各类状态数量 For Each item As GridItem In rg_SystemExp.Items If TypeOf item Is GridDataItem Then Dim dataItem As GridDataItem = DirectCast(item, GridDataItem) Dim myCell As TableCell = dataItem("Status") Dim statusValue As Integer ' 先判断是否是数字,避免TBD的情况报错 If Integer.TryParse(myCell.Text, statusValue) Then Select Case statusValue Case >= 180 Green += 1 Case >= 120 Yellow += 1 Case >= 90 Orange += 1 Case < 90 Red += 1 End Select ' TBD情况无需计数,跳过 ElseIf myCell.Text = "TBD" Then Continue For End If End If Next ' 构造rg_StatusCounts的数据源 Dim dt As New DataTable() dt.Columns.Add("绿色计数") dt.Columns.Add("黄色计数") dt.Columns.Add("橙色计数") dt.Columns.Add("红色计数") ' 添加统计结果行 Dim row As DataRow = dt.NewRow() row("绿色计数") = Green row("黄色计数") = Yellow row("橙色计数") = Orange row("红色计数") = Red dt.Rows.Add(row) ' 绑定到状态统计网格 rg_StatusCounts.DataSource = dt rg_StatusCounts.DataBind() End Sub ' 保留原ItemDataBound事件处理单行样式 Protected Sub rg_SystemExp_ItemDataBound(ByVal s As Object, ByVal e As GridItemEventArgs) Handles rg_SystemExp.ItemDataBound If TypeOf e.Item Is GridDataItem Then Dim dataItem As GridDataItem = DirectCast(e.Item, GridDataItem) Dim myCell As TableCell = dataItem("Status") Dim statusValue As Integer If Integer.TryParse(myCell.Text, statusValue) Then Select Case statusValue Case >= 180 dataItem.BackColor = Drawing.Color.Green dataItem.ForeColor = Drawing.Color.White Case >= 120 dataItem.BackColor = Drawing.Color.Yellow dataItem.ForeColor = Drawing.Color.Black Case >= 90 dataItem.BackColor = Drawing.Color.Orange dataItem.ForeColor = Drawing.Color.White Case < 90 dataItem.BackColor = Drawing.Color.Red dataItem.ForeColor = Drawing.Color.White End Select ElseIf myCell.Text = "TBD" Then dataItem.BackColor = Drawing.Color.Gray dataItem.ForeColor = Drawing.Color.Black End If End If End Sub
补充说明
- 把样式处理和统计逻辑拆分到两个事件:
ItemDataBound负责单行样式设置,DataBound负责全局计数统计,职责更清晰。 - 统计时用
Integer.TryParse避免非数字文本(比如"TBD")导致的转换报错,代码更健壮。 - 通过构造
DataTable作为rg_StatusCounts的数据源,直接就能生成对应的统计行,无需手动添加行项。
内容的提问来源于stack exchange,提问作者SethD02
相关产品推荐
相关产品推荐

