如何实现C1 TrueDBGrid第三列基于另外两列值自动计算?
实现C1 TrueDBGrid第三列自动计算的解决方案
Got it, let's get your C1 TrueDBGrid's TOTAL column to calculate automatically based on the DENOMINATION and COUNT values. Here are two reliable approaches to achieve this:
方法1:使用DataTable计算列(推荐)
这种方式最简洁,让DataTable本身负责计算逻辑,绑定到网格后会自动同步更新,无需额外事件处理。
修改DataSet/DataTable创建代码
首先调整你的数据表结构,把TOTAL设为计算列,指定计算公式为DENOMINATION * COUNT。同时建议把DENOMINATION和COUNT设为数值类型(而非字符串),避免转换错误:
DataSet ds = new DataSet(); DataTable dt = new DataTable(); // 定义数值类型的列,方便计算 dt.Columns.Add("DENOMINATION", typeof(decimal)); dt.Columns.Add("COUNT", typeof(int)); // 创建计算列:自动计算DENOMINATION与COUNT的乘积 dt.Columns.Add("TOTAL", typeof(decimal), "DENOMINATION * COUNT"); // 添加行时只需传入DENOMINATION和COUNT,TOTAL会自动生成 dt.Rows.Add(new object[] { 1000m, 0 }); dt.Rows.Add(new object[] { 500m, 0 }); dt.Rows.Add(new object[] { 200m, 0 }); dt.Rows.Add(new object[] { 100m, 0 }); dt.Rows.Add(new object[] { 50m, 0 }); dt.Rows.Add(new object[] { 20m, 0 }); dt.Rows.Add(new object[] { 10m, 0 }); // 继续添加其他行...
绑定到C1 TrueDBGrid并配置列属性
绑定数据后,可设置TOTAL列为只读,避免手动修改,还能格式化显示:
// 绑定数据表到网格 c1TrueDBGrid1.DataSource = dt; c1TrueDBGrid1.DataMember = dt.TableName; // 配置TOTAL列:设为只读,格式化显示为两位小数 c1TrueDBGrid1.Columns["TOTAL"].ReadOnly = true; c1TrueDBGrid1.Columns["TOTAL"].Format = "N2";
优势:新增行、编辑DENOMINATION/COUNT时,TOTAL会自动实时更新,无需写额外事件逻辑。
方法2:通过TrueDBGrid事件手动计算
如果你需要更灵活的控制(比如自定义计算逻辑、处理特殊格式的字符串值),可以监听网格的AfterColEdit事件,在编辑完成后手动计算TOTAL:
绑定数据(保留原字符串列的情况)
如果你的DENOMINATION必须是字符串类型,先按原方式创建数据表,再绑定:
// 原DataSet/DataTable创建代码(DENOMINATION为字符串类型) DataSet ds = new DataSet(); DataTable dt = new DataTable(); dt.Columns.Add("DENOMINATION"); dt.Columns.Add("COUNT"); dt.Columns.Add("TOTAL"); dt.Rows.Add(new object[] { "1000", "0", "0" }); dt.Rows.Add(new object[] { "500", "0", "0" }); // ...其他行 // 绑定到网格 c1TrueDBGrid1.DataSource = dt; c1TrueDBGrid1.DataMember = dt.TableName;
订阅AfterColEdit事件
在窗体的构造函数或Load事件中添加事件绑定:
c1TrueDBGrid1.AfterColEdit += C1TrueDBGrid1_AfterColEdit;
实现事件处理逻辑
在事件方法中判断编辑的列,转换数值后计算TOTAL:
private void C1TrueDBGrid1_AfterColEdit(object sender, C1.Win.C1TrueDBGrid.ColEventArgs e) { // 仅当编辑DENOMINATION(索引0)或COUNT(索引1)列时触发计算 if (e.Col.Index is 0 or 1) { DataRowView currentRow = (DataRowView)c1TrueDBGrid1.Row; // 尝试转换字符串为数值,避免格式错误 if (decimal.TryParse(currentRow["DENOMINATION"].ToString(), out decimal denomination) && int.TryParse(currentRow["COUNT"].ToString(), out int count)) { currentRow["TOTAL"] = denomination * count; } else { // 转换失败时设为0 currentRow["TOTAL"] = 0; } } }
优势:可以处理复杂的自定义计算逻辑,兼容字符串类型的数值列。
内容的提问来源于stack exchange,提问作者Alphatrix
相关产品推荐
相关产品推荐

