=========环境配置=========================
创建c# winform 新项目 test_devexpress
添加引用
把DevExpress.XtraGrid.v17.1.dll拖到工具箱
================================================
在界面中,加入2个 GridControl
设计器代码:
namespace test_devexpress
{partial class Form1{/// <summary>/// 必需的设计器变量。/// </summary>private System.ComponentModel.IContainer components = null;/// <summary>/// 清理所有正在使用的资源。/// </summary>/// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>protected override void Dispose(bool disposing){if (disposing && (components != null)){components.Dispose();}base.Dispose(disposing);}#region Windows 窗体设计器生成的代码/// <summary>/// 设计器支持所需的方法 - 不要修改/// 使用代码编辑器修改此方法的内容。/// </summary>private void InitializeComponent(){this.button_start = new System.Windows.Forms.Button();this.gridControl1 = new DevExpress.XtraGrid.GridControl();this.gridView1 = new DevExpress.XtraGrid.Views.Grid.GridView();this.gridControl2 = new DevExpress.XtraGrid.GridControl();this.gridView2 = new DevExpress.XtraGrid.Views.Grid.GridView();((System.ComponentModel.ISupportInitialize)(this.gridControl1)).BeginInit();((System.ComponentModel.ISupportInitialize)(this.gridView1)).BeginInit();((System.ComponentModel.ISupportInitialize)(this.gridControl2)).BeginInit();((System.ComponentModel.ISupportInitialize)(this.gridView2)).BeginInit();this.SuspendLayout();// // button_start// this.button_start.Location = new System.Drawing.Point(512, 609);this.button_start.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);this.button_start.Name = "button_start";this.button_start.Size = new System.Drawing.Size(219, 74);this.button_start.TabIndex = 0;this.button_start.Text = "button1";this.button_start.UseVisualStyleBackColor = true;this.button_start.Click += new System.EventHandler(this.button_start_Click);// // gridControl1// this.gridControl1.EmbeddedNavigator.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);this.gridControl1.Location = new System.Drawing.Point(350, 54);this.gridControl1.MainView = this.gridView1;this.gridControl1.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);this.gridControl1.Name = "gridControl1";this.gridControl1.Size = new System.Drawing.Size(573, 174);this.gridControl1.TabIndex = 0;this.gridControl1.ViewCollection.AddRange(new DevExpress.XtraGrid.Views.Base.BaseView[] {this.gridView1});// // gridView1// this.gridView1.GridControl = this.gridControl1;this.gridView1.Name = "gridView1";// // gridControl2// this.gridControl2.EmbeddedNavigator.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);this.gridControl2.Location = new System.Drawing.Point(350, 316);this.gridControl2.MainView = this.gridView2;this.gridControl2.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);this.gridControl2.Name = "gridControl2";this.gridControl2.Size = new System.Drawing.Size(562, 179);this.gridControl2.TabIndex = 0;this.gridControl2.ViewCollection.AddRange(new DevExpress.XtraGrid.Views.Base.BaseView[] {this.gridView2});// // gridView2// this.gridView2.GridControl = this.gridControl2;this.gridView2.Name = "gridView2";// // Form1// this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 18F);this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;this.ClientSize = new System.Drawing.Size(1276, 751);this.Controls.Add(this.gridControl1);this.Controls.Add(this.button_start);this.Controls.Add(this.gridControl2);this.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);this.Name = "Form1";this.Text = "Form1";((System.ComponentModel.ISupportInitialize)(this.gridControl1)).EndInit();((System.ComponentModel.ISupportInitialize)(this.gridView1)).EndInit();((System.ComponentModel.ISupportInitialize)(this.gridControl2)).EndInit();((System.ComponentModel.ISupportInitialize)(this.gridView2)).EndInit();this.ResumeLayout(false);}#endregionprivate System.Windows.Forms.Button button_start;private DevExpress.XtraGrid.GridControl gridControl1;private DevExpress.XtraGrid.Views.Grid.GridView gridView1;private DevExpress.XtraGrid.GridControl gridControl2;private DevExpress.XtraGrid.Views.Grid.GridView gridView2;}
}
===============================================
定义表格数据源
// 创建数据源
DataTable dt = new DataTable();
DataTable dt2 = new DataTable();
初始化表格函数:
private void ConfigureGridView(object sender, EventArgs e)
{
// 清除默认列
gridView1.Columns.Clear();
gridView2.Columns.Clear();
dt.Columns.Add("工作收入");
dt.Columns.Add("补贴收入");
dt.Columns.Add("股票收入");
dt.Columns.Add("生活支出");
dt.Columns.Add("房租支出");
dt.Columns.Add("通勤支出");
dt.Rows.Add("8500", "0", "0", "0", "1200", "0");
gridControl1.DataSource = dt;
dt2.Columns.Add("总收入");
dt2.Columns.Add("总支出");
dt2.Columns.Add("净收入");
dt2.Rows.Add("0", "0", "0");
gridControl2.DataSource = dt2;
// 可选:设置自动调整列宽
gridView1.BestFitColumns();
gridView2.BestFitColumns();
}
Columns.Add增加列
Rows.Add增加行
(注意要先添加列,添加行中的元素个数要和列数一致)
运行后:
===========================================================
在button的点击事件中获取表一的数据,并计算,然后输出到表二。
获取数据:对于数据dt
使用
int money = Convert.ToInt32(dt.Rows[0]["工作收入"] )
来获取“工作收入”一项中的第0行的数据。
使用
dt2.Rows[0]["总支出"] = 1000
给总支出的第0行 写入数据1000。
完整代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using DevExpress;
using DevExpress.XtraGrid;
using DevExpress.XtraGrid.Columns;namespace test_devexpress
{public partial class Form1 : Form{// 创建数据源DataTable dt = new DataTable();DataTable dt2 = new DataTable();public Form1(){InitializeComponent();Load += ConfigureGridView; // 订阅窗体加载事件}private void ConfigureGridView(object sender, EventArgs e){// 清除默认列gridView1.Columns.Clear();gridView2.Columns.Clear();dt.Columns.Add("工作收入");dt.Columns.Add("补贴收入");dt.Columns.Add("股票收入");dt.Columns.Add("生活支出");dt.Columns.Add("房租支出");dt.Columns.Add("通勤支出");dt.Rows.Add("8500", "0", "0", "0", "1200", "0");gridControl1.DataSource = dt;dt2.Columns.Add("总收入");dt2.Columns.Add("总支出");dt2.Columns.Add("净收入");dt2.Rows.Add("0", "0", "0");gridControl2.DataSource = dt2;// 可选:设置自动调整列宽gridView1.BestFitColumns();gridView2.BestFitColumns();}private void button_start_Click(object sender, EventArgs e){// 获取表一数据源DataTable dt1 = (DataTable)gridControl1.DataSource;decimal totalIncome = 0, totalExpense = 0;// 计算总收入和总支出foreach (DataRow row in dt1.Rows){// 收入计算totalIncome += Convert.ToDecimal(row["工作收入"]);totalIncome += Convert.ToDecimal(row["补贴收入"]);totalIncome += Convert.ToDecimal(row["股票收入"]);// 支出计算totalExpense += Convert.ToDecimal(row["生活支出"]);totalExpense += Convert.ToDecimal(row["房租支出"]);totalExpense += Convert.ToDecimal(row["通勤支出"]);}decimal netIncome = totalIncome - totalExpense;// 更新表二数据DataTable dt2 = (DataTable)gridControl2.DataSource;dt2.Rows[0]["总收入"] = totalIncome.ToString("N0"); // 格式化为千位分隔符dt2.Rows[0]["总支出"] = totalExpense.ToString("N0");dt2.Rows[0]["净收入"] = netIncome.ToString("N0");// 刷新表格显示gridView2.RefreshData();}}
}
运行后,输入数据:
=====================
表格单元格的 双击事件
如图。双击表二的各种操作,执行对应月份的计算,并显示。
实现:
双击事件:
private void GridView2_DoubleClick(object sender, EventArgs e)
{
// 获取点击的位置
GridView view = sender as GridView;
GridHitInfo hitInfo = view.CalcHitInfo(view.GridControl.PointToClient(MousePosition));
// 检查是否点击了单元格
if (hitInfo.InRowCell)
{
int rowHandle = hitInfo.RowHandle;
GridColumn column = hitInfo.Column;
// 获取月份(列字段名)
string month = column.FieldName;
// 获取操作类型(行索引)
string operation = view.GetRowCellDisplayText(rowHandle, "操作");
// 只处理前三种操作
if (rowHandle >= 0 && rowHandle <= 2)
{
double result = 0;
// 根据操作类型进行计算
switch (operation)
{
case "操作1": // 总收入
result = CalculateTotalIncome(month);
break;
case "操作2": // 总支出
result = CalculateTotalExpense(month);
break;
case "操作3": // 净收入
result = CalculateNetIncome(month);
break;
}
// 更新结果行(第4行,索引为3)
dt2.Rows[3][month] = result.ToString();
// 刷新显示
gridControl2.RefreshDataSource();
}
}
}
完整代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using DevExpress;
using DevExpress.XtraGrid;
using DevExpress.XtraGrid.Columns;
using DevExpress.XtraGrid.Views.Grid;
using DevExpress.XtraGrid.Views.Grid.ViewInfo;namespace test_devexpress
{public partial class Form1 : Form{// 创建数据源DataTable dt = new DataTable();DataTable dt2 = new DataTable();public Form1(){InitializeComponent();Load += ConfigureGridView; // 订阅窗体加载事件}private void ConfigureGridView(object sender, EventArgs e){// 清除默认列gridView1.Columns.Clear();gridView2.Columns.Clear();dt.Columns.Add("序号");dt.Columns.Add("工作收入");dt.Columns.Add("补贴收入");dt.Columns.Add("股票收入");dt.Columns.Add("生活支出");dt.Columns.Add("房租支出");dt.Columns.Add("通勤支出");dt.Rows.Add("一月", "8500", "0", "0", "0", "1200", "0");dt.Rows.Add("二月", "8500", "0", "0", "0", "1200", "0");dt.Rows.Add("三月", "8500", "0", "0", "0", "1200", "0");gridControl1.DataSource = dt;dt2.Columns.Add("操作");dt2.Columns.Add("一月");dt2.Columns.Add("二月");dt2.Columns.Add("三月");dt2.Rows.Add("操作1", "总收入", "总收入", "总收入");dt2.Rows.Add("操作2", "总支出", "总支出", "总支出");dt2.Rows.Add("操作3", "净收入", "净收入", "净收入");dt2.Rows.Add("双击后显示结果", "0", "0", "0");gridControl2.DataSource = dt2;// 设置gridView2为不可编辑gridView2.OptionsBehavior.Editable = false;// 为gridView2添加双击事件处理gridView2.DoubleClick += GridView2_DoubleClick;// 可选:设置自动调整列宽gridView1.BestFitColumns();gridView2.BestFitColumns();}private void GridView2_DoubleClick(object sender, EventArgs e){// 获取点击的位置GridView view = sender as GridView;GridHitInfo hitInfo = view.CalcHitInfo(view.GridControl.PointToClient(MousePosition));// 检查是否点击了单元格if (hitInfo.InRowCell){int rowHandle = hitInfo.RowHandle;GridColumn column = hitInfo.Column;// 获取月份(列字段名)string month = column.FieldName;// 获取操作类型(行索引)string operation = view.GetRowCellDisplayText(rowHandle, "操作");// 只处理前三种操作if (rowHandle >= 0 && rowHandle <= 2){double result = 0;// 根据操作类型进行计算switch (operation){case "操作1": // 总收入result = CalculateTotalIncome(month);break;case "操作2": // 总支出result = CalculateTotalExpense(month);break;case "操作3": // 净收入result = CalculateNetIncome(month);break;}// 更新结果行(第4行,索引为3)dt2.Rows[3][month] = result.ToString();// 刷新显示gridControl2.RefreshDataSource();}}}private double CalculateTotalIncome(string month){// 在dt中查找对应月份的行DataRow[] rows = dt.Select($"序号 = '{month}'");if (rows.Length > 0){DataRow row = rows[0];return Convert.ToDouble(row["工作收入"]) +Convert.ToDouble(row["补贴收入"]) +Convert.ToDouble(row["股票收入"]);}return 0;}private double CalculateTotalExpense(string month){// 在dt中查找对应月份的行DataRow[] rows = dt.Select($"序号 = '{month}'");if (rows.Length > 0){DataRow row = rows[0];return Convert.ToDouble(row["生活支出"]) +Convert.ToDouble(row["房租支出"]) +Convert.ToDouble(row["通勤支出"]);}return 0;}private double CalculateNetIncome(string month){return CalculateTotalIncome(month) - CalculateTotalExpense(month);}private void button_start_Click(object sender, EventArgs e){// 刷新表格显示gridView2.RefreshData();}}
}
其中:
CalculateTotalIncome:计算指定月份的总收入
CalculateTotalExpense:计算指定月份的总支出
CalculateNetIncome:计算指定月份的净收入
namespace test_devexpress
{partial class Form1{/// <summary>/// 必需的设计器变量。/// </summary>private System.ComponentModel.IContainer components = null;/// <summary>/// 清理所有正在使用的资源。/// </summary>/// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>protected override void Dispose(bool disposing){if (disposing && (components != null)){components.Dispose();}base.Dispose(disposing);}#region Windows 窗体设计器生成的代码/// <summary>/// 设计器支持所需的方法 - 不要修改/// 使用代码编辑器修改此方法的内容。/// </summary>private void InitializeComponent(){this.button_start = new System.Windows.Forms.Button();this.gridControl1 = new DevExpress.XtraGrid.GridControl();this.gridView1 = new DevExpress.XtraGrid.Views.Grid.GridView();this.gridControl2 = new DevExpress.XtraGrid.GridControl();this.gridView2 = new DevExpress.XtraGrid.Views.Grid.GridView();((System.ComponentModel.ISupportInitialize)(this.gridControl1)).BeginInit();((System.ComponentModel.ISupportInitialize)(this.gridView1)).BeginInit();((System.ComponentModel.ISupportInitialize)(this.gridControl2)).BeginInit();((System.ComponentModel.ISupportInitialize)(this.gridView2)).BeginInit();this.SuspendLayout();// // button_start// this.button_start.Location = new System.Drawing.Point(512, 649);this.button_start.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);this.button_start.Name = "button_start";this.button_start.Size = new System.Drawing.Size(219, 74);this.button_start.TabIndex = 0;this.button_start.Text = "button1";this.button_start.UseVisualStyleBackColor = true;this.button_start.Click += new System.EventHandler(this.button_start_Click);// // gridControl1// this.gridControl1.EmbeddedNavigator.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);this.gridControl1.Location = new System.Drawing.Point(327, 13);this.gridControl1.MainView = this.gridView1;this.gridControl1.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);this.gridControl1.Name = "gridControl1";this.gridControl1.Size = new System.Drawing.Size(685, 267);this.gridControl1.TabIndex = 0;this.gridControl1.ViewCollection.AddRange(new DevExpress.XtraGrid.Views.Base.BaseView[] {this.gridView1});// // gridView1// this.gridView1.GridControl = this.gridControl1;this.gridView1.Name = "gridView1";// // gridControl2// this.gridControl2.EmbeddedNavigator.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);this.gridControl2.Location = new System.Drawing.Point(327, 319);this.gridControl2.MainView = this.gridView2;this.gridControl2.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);this.gridControl2.Name = "gridControl2";this.gridControl2.Size = new System.Drawing.Size(685, 306);this.gridControl2.TabIndex = 0;this.gridControl2.ViewCollection.AddRange(new DevExpress.XtraGrid.Views.Base.BaseView[] {this.gridView2});// // gridView2// this.gridView2.GridControl = this.gridControl2;this.gridView2.Name = "gridView2";// // Form1// this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 18F);this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;this.ClientSize = new System.Drawing.Size(1276, 751);this.Controls.Add(this.gridControl1);this.Controls.Add(this.button_start);this.Controls.Add(this.gridControl2);this.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);this.Name = "Form1";this.Text = "Form1";((System.ComponentModel.ISupportInitialize)(this.gridControl1)).EndInit();((System.ComponentModel.ISupportInitialize)(this.gridView1)).EndInit();((System.ComponentModel.ISupportInitialize)(this.gridControl2)).EndInit();((System.ComponentModel.ISupportInitialize)(this.gridView2)).EndInit();this.ResumeLayout(false);}#endregionprivate System.Windows.Forms.Button button_start;private DevExpress.XtraGrid.GridControl gridControl1;private DevExpress.XtraGrid.Views.Grid.GridView gridView1;private DevExpress.XtraGrid.GridControl gridControl2;private DevExpress.XtraGrid.Views.Grid.GridView gridView2;}
}
运行后: