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

DevExpress XtraGridView指定列总和无法在TextEdit显示求排查

问题分析与修复方案

代码中的问题点

  • 控件名不匹配:GetSummary方法里错误给textEdit赋值,但实际需要更新的是TotalMaterialsTextEdit,控件名称不一致导致初始值无法正确显示。
  • 添加行后未同步汇总:点击添加按钮新增数据行后,没有触发汇总计算并更新TotalMaterialsTextEdit的值。
  • 汇总项添加逻辑冗余:直接调用Summary.Add可能重复创建汇总项,且配置方式不够严谨。
  • 重复绑定数据源:GetTable已将gridView.DataSource绑定到dt,添加按钮里再次设置OBTAFormGridControl.DataSource = dt属于冗余操作,可能干扰数据同步。
  • 初始汇总时机不合理:FORM_Shown时DataTable为空,此时赋值无实际意义,且控件名错误导致操作无效。

修正后的代码

Public Class FORM
    Dim dt As New DataTable("Table")
    Private Sub FORM_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        InitializeApps()
        GetTable()
        GetSummary() ' 移至Load中完成汇总初始化
    End Sub

    Sub GetSummary()
        ' 先清除已有汇总项,避免重复添加
        gridView.Columns("Materials").Summary.Clear()
        ' 创建并配置汇总项
        Dim sumItem As New DevExpress.XtraGrid.GridSummaryItem()
        sumItem.SummaryType = DevExpress.Data.SummaryItemType.Sum
        sumItem.DisplayFormat = "{0:0,0}"
        sumItem.FieldName = "Materials"
        gridView.Columns("Materials").Summary.Add(sumItem)
        ' 初始化汇总文本框
        UpdateTotalText()
    End Sub

    Sub GetTable()
        dt.Columns.Add("Materials", GetType(Double))
        ' 仅绑定一次数据源
        OBTAFormGridControl.DataSource = dt
        gridView.DataSource = dt
    End Sub

    Private Sub AddtoTableSimpleButton_Click(sender As Object, e As EventArgs) Handles AddtoTableSimpleButton.Click
        ' 验证输入有效性,避免异常
        If Double.TryParse(MaterialsTextEdit.Text, Dim value) Then
            dt.Rows.Add(value)
            ' 添加行后立即更新汇总
            UpdateTotalText()
        Else
            MessageBox.Show("请输入有效的数字")
        End If
    End Sub

    Private Sub gridView_CellValueChanged(sender As Object, e As Views.Base.CellValueChangedEventArgs) Handles gridView.CellValueChanged
        ' 仅修改Materials列时更新汇总
        If e.Column.FieldName = "Materials" Then
            gridView.UpdateTotalSummary()
            UpdateTotalText()
        End If
    End Sub

    ' 封装汇总更新逻辑,避免重复代码
    Private Sub UpdateTotalText()
        Dim total As Object = gridView.Columns("Materials").Summary.SummaryValues(DevExpress.Data.SummaryItemType.Sum)
        ' 处理空表情况,避免空值
        Me.TotalMaterialsTextEdit.EditValue = If(total Is DBNull.Value, 0, total)
    End Sub
End Class

关键修改说明

  • 统一汇总更新逻辑:新增UpdateTotalText方法,将获取汇总值并赋值的操作封装,减少重复代码。
  • 修正控件指向:所有汇总更新操作均指向TotalMaterialsTextEdit,确保目标控件正确。
  • 添加输入验证:用Double.TryParse替代Double.Parse,避免无效输入引发异常。
  • 优化汇总项初始化:先清除已有汇总项再添加,避免重复创建;通过GridSummaryItem明确配置汇总参数。
  • 移除冗余数据源绑定:仅在GetTable中设置一次数据源,后续DataTable的变化会自动同步到GridView。
  • 事件触发优化:仅当修改Materials列时才更新汇总,减少不必要的计算开销。

内容的提问来源于stack exchange,提问作者DeveloperGuy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 12:12:14