=========環境配置=========================
創建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;}
}
運行后: