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

如何从后台代码向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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 12:52:49