c# 基于xml文件和devexpress插件 的工作流程配置
效果如下:
屏幕录制 2025-10-28 134826
前言
c# winform 使用DevExpress制作表格:
https://blog.csdn.net/2302_76790436/article/details/151212974?spm=1011.2415.3001.10575&sharefrom=mp_manage_link
c# 读取xml文件内的数据
https://blog.csdn.net/2302_76790436/article/details/150614884?spm=1011.2415.3001.10575&sharefrom=mp_manage_link
界面设置
主界面:

包括 按钮,文本框,和devexpress表格
namespace testProcess
{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.components = new System.ComponentModel.Container();this.button_choose = new System.Windows.Forms.Button();this.gridControl1 = new DevExpress.XtraGrid.GridControl();this.gridView1 = new DevExpress.XtraGrid.Views.Grid.GridView();this.behaviorManager1 = new DevExpress.Utils.Behaviors.BehaviorManager(this.components);this.button_Design = new System.Windows.Forms.Button();this.button_start = new System.Windows.Forms.Button();this.textBox1 = new System.Windows.Forms.TextBox();((System.ComponentModel.ISupportInitialize)(this.gridControl1)).BeginInit();((System.ComponentModel.ISupportInitialize)(this.gridView1)).BeginInit();((System.ComponentModel.ISupportInitialize)(this.behaviorManager1)).BeginInit();this.SuspendLayout();// // button_choose// this.button_choose.Location = new System.Drawing.Point(51, 3);this.button_choose.Name = "button_choose";this.button_choose.Size = new System.Drawing.Size(144, 81);this.button_choose.TabIndex = 0;this.button_choose.Text = "选择配置";this.button_choose.UseVisualStyleBackColor = true;this.button_choose.Click += new System.EventHandler(this.button_choose_Click);// // gridControl1// this.gridControl1.Location = new System.Drawing.Point(51, 101);this.gridControl1.MainView = this.gridView1;this.gridControl1.Name = "gridControl1";this.gridControl1.Size = new System.Drawing.Size(464, 300);this.gridControl1.TabIndex = 1;this.gridControl1.ViewCollection.AddRange(new DevExpress.XtraGrid.Views.Base.BaseView[] {this.gridView1});// // gridView1// this.gridView1.GridControl = this.gridControl1;this.gridView1.Name = "gridView1";this.gridView1.OptionsView.ShowGroupPanel = false;// // button_Design// this.button_Design.Location = new System.Drawing.Point(318, 3);this.button_Design.Name = "button_Design";this.button_Design.Size = new System.Drawing.Size(133, 81);this.button_Design.TabIndex = 2;this.button_Design.Text = "流程设置";this.button_Design.UseVisualStyleBackColor = true;this.button_Design.Click += new System.EventHandler(this.button_Design_Click);// // button_start// this.button_start.Location = new System.Drawing.Point(173, 452);this.button_start.Name = "button_start";this.button_start.Size = new System.Drawing.Size(198, 50);this.button_start.TabIndex = 3;this.button_start.Text = "启动";this.button_start.UseVisualStyleBackColor = true;this.button_start.Click += new System.EventHandler(this.button_start_Click);// // textBox1// this.textBox1.Location = new System.Drawing.Point(687, 101);this.textBox1.Multiline = true;this.textBox1.Name = "textBox1";this.textBox1.Size = new System.Drawing.Size(323, 300);this.textBox1.TabIndex = 4;// // Form1// this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 15F);this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;this.ClientSize = new System.Drawing.Size(1079, 564);this.Controls.Add(this.textBox1);this.Controls.Add(this.button_start);this.Controls.Add(this.button_Design);this.Controls.Add(this.gridControl1);this.Controls.Add(this.button_choose);this.Name = "Form1";this.Text = "Form1";((System.ComponentModel.ISupportInitialize)(this.gridControl1)).EndInit();((System.ComponentModel.ISupportInitialize)(this.gridView1)).EndInit();((System.ComponentModel.ISupportInitialize)(this.behaviorManager1)).EndInit();this.ResumeLayout(false);this.PerformLayout();}#endregionprivate System.Windows.Forms.Button button_choose;private DevExpress.XtraGrid.GridControl gridControl1;private DevExpress.XtraGrid.Views.Grid.GridView gridView1;private DevExpress.Utils.Behaviors.BehaviorManager behaviorManager1;private System.Windows.Forms.Button button_Design;private System.Windows.Forms.Button button_start;private System.Windows.Forms.TextBox textBox1;}
}
配置流程界面:

表格,按钮
namespace testProcess
{partial class designprocess{/// <summary>/// Required designer variable./// </summary>private System.ComponentModel.IContainer components = null;/// <summary>/// Clean up any resources being used./// </summary>/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>protected override void Dispose(bool disposing){if (disposing && (components != null)){components.Dispose();}base.Dispose(disposing);}#region Windows Form Designer generated code/// <summary>/// Required method for Designer support - do not modify/// the contents of this method with the code editor./// </summary>private void InitializeComponent(){this.gridControl1 = new DevExpress.XtraGrid.GridControl();this.gridView1 = new DevExpress.XtraGrid.Views.Grid.GridView();this.button_save = new System.Windows.Forms.Button();((System.ComponentModel.ISupportInitialize)(this.gridControl1)).BeginInit();((System.ComponentModel.ISupportInitialize)(this.gridView1)).BeginInit();this.SuspendLayout();// // gridControl1// this.gridControl1.Location = new System.Drawing.Point(238, 30);this.gridControl1.MainView = this.gridView1;this.gridControl1.Name = "gridControl1";this.gridControl1.Size = new System.Drawing.Size(436, 310);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";this.gridView1.OptionsView.ShowGroupPanel = false;// // button_save// this.button_save.Location = new System.Drawing.Point(362, 390);this.button_save.Name = "button_save";this.button_save.Size = new System.Drawing.Size(177, 67);this.button_save.TabIndex = 1;this.button_save.Text = "导出配置";this.button_save.UseVisualStyleBackColor = true;this.button_save.Click += new System.EventHandler(this.button_save_Click);// // designprocess// this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 15F);this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;this.ClientSize = new System.Drawing.Size(870, 512);this.Controls.Add(this.button_save);this.Controls.Add(this.gridControl1);this.Name = "designprocess";this.Text = "Form2";((System.ComponentModel.ISupportInitialize)(this.gridControl1)).EndInit();((System.ComponentModel.ISupportInitialize)(this.gridView1)).EndInit();this.ResumeLayout(false);}#endregionprivate DevExpress.XtraGrid.GridControl gridControl1;private DevExpress.XtraGrid.Views.Grid.GridView gridView1;private System.Windows.Forms.Button button_save;}
}
重命名窗口:

实现

数据格式:
//构造xml数据格式
public class ProjectParams
{
public string Name { get; set; }
public List<Process> Processes { get; set; } = new List<Process>();
}
public class Process
{
public string Name { get; set; }
public string DisplayText { get; set; }
}
每个项目ProjectParams有 一个Name 和 多个Processes,
其中Processes中有Name和 DisplayText
xml文件的内容示例:

在配置流程界面中添加右键菜单
private void GridView1_PopupMenuShowing(object sender, DevExpress.XtraGrid.Views.Grid.PopupMenuShowingEventArgs e)
{
if (e.HitInfo.InRow)
{
_rightClickedRowHandle = e.HitInfo.RowHandle;
e.Menu.Items.Clear();
// 创建右键菜单项
DevExpress.Utils.Menu.DXMenuItem menuItem;
menuItem = new DevExpress.Utils.Menu.DXMenuItem("添加市场调研", 添加市场调研ToolStripMenuItem_Click);
e.Menu.Items.Add(menuItem);
menuItem = new DevExpress.Utils.Menu.DXMenuItem("添加产品设计", 添加产品设计ToolStripMenuItem_Click);
e.Menu.Items.Add(menuItem);
menuItem = new DevExpress.Utils.Menu.DXMenuItem("添加营销推广", 添加营销推广ToolStripMenuItem_Click);
e.Menu.Items.Add(menuItem);
menuItem = new DevExpress.Utils.Menu.DXMenuItem("添加主持会议", 添加主持会议ToolStripMenuItem_Click);
e.Menu.Items.Add(menuItem);
menuItem = new DevExpress.Utils.Menu.DXMenuItem("添加产线升级", 添加产线升级ToolStripMenuItem_Click);
e.Menu.Items.Add(menuItem);
e.Menu.Items.Add(new DevExpress.Utils.Menu.DXMenuItem("-"));
// 添加删除流程菜单项
menuItem = new DevExpress.Utils.Menu.DXMenuItem("删除流程", 删除流程ToolStripMenuItem_Click);
e.Menu.Items.Add(menuItem);
e.Menu.Items.Add(new DevExpress.Utils.Menu.DXMenuItem("-"));
menuItem = new DevExpress.Utils.Menu.DXMenuItem("重命名项目", 重命名ToolStripMenuItem_Click);
e.Menu.Items.Add(menuItem);
}
}
完成表格的绘制后,转换为xml
private void ExportToXml(string filePath)
{
try
{
XElement root = new XElement("root");
// 按项目名称分组
var projects = dataTable.AsEnumerable()
.GroupBy(row => new
{
ProjectName = row.Field<string>("项目名称"),
});
foreach (var projectGroup in projects)
{
XElement projectElement = new XElement("Project",
new XAttribute("name", projectGroup.Key.ProjectName)
);
foreach (var row in projectGroup)
{
string processName = row.Field<string>("项目流程");
string displayText = GetDisplayTextByProcessName(processName);
XElement processElement = new XElement("process",
new XAttribute("name", processName));
XElement paramElement = new XElement("param",
new XAttribute("name", "text"),
new XAttribute("value", displayText));
processElement.Add(paramElement);
projectElement.Add(processElement);
}
root.Add(projectElement);
}
XDocument doc = new XDocument(root);
doc.Save(filePath);
}
catch (Exception ex)
{
MessageBox.Show($"导出XML失败: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
相应的,主界面中加载xml,并绘制表格:
//加载XML文件并显示在gridControl1
private void LoadXmlFile(string filePath)
{
try
{
projects.Clear(); // 清空现有项目列表
XDocument doc = XDocument.Load(filePath);
// 初始化DataTable
DataTable dataTable = new DataTable();
dataTable.Columns.Add("项目名称");
dataTable.Columns.Add("流程名称");
foreach (var projectElement in doc.Root.Elements("Project"))
{
string projectName = projectElement.Attribute("name")?.Value;
var project = new ProjectParams
{
Name = projectName,
};
foreach (var processElement in projectElement.Elements("process"))
{
string processName = processElement.Attribute("name")?.Value;
string displayText = processElement.Element("param")?.Attribute("value")?.Value;
project.Processes.Add(new Process
{
Name = processName,
DisplayText = displayText
});
// 添加到DataTable
dataTable.Rows.Add(projectName, processName);
}
projects.Add(project);
}
gridControl1.DataSource = dataTable;
// 强制生成列
gridView1.PopulateColumns();
// 现在再设置合并单元格
gridView1.OptionsView.AllowCellMerge = true;
gridView1.Columns["项目名称"].OptionsColumn.AllowMerge = DevExpress.Utils.DefaultBoolean.True;
gridView1.Columns["流程名称"].OptionsColumn.AllowMerge = DevExpress.Utils.DefaultBoolean.False;
gridView1.BestFitColumns();
MessageBox.Show($"成功加载配置文件,共 {projects.Count} 个项目", "成功",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception ex)
{
MessageBox.Show($"加载XML文件失败: {ex.Message}", "错误",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}

完整代码
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 System.Xml.Linq;
using System.IO;
using System.Threading;namespace testProcess
{public partial class Form1 : Form{public static string newname;string filePath;private List<ProjectParams> projects = new List<ProjectParams>();public Form1(){InitializeComponent();}//设置流程private void button_Design_Click(object sender, EventArgs e){designprocess designprocess1 = new designprocess();designprocess1.ShowDialog();}//选择并加载流程配置文件xmlprivate void button_choose_Click(object sender, EventArgs e){//选择xml文件using (OpenFileDialog openFileDialog = new OpenFileDialog()){openFileDialog.Filter = "XML文件|*.xml|所有文件|*.*";openFileDialog.Title = "选择流程配置文件";if (openFileDialog.ShowDialog() == DialogResult.OK){filePath = openFileDialog.FileName;LoadXmlFile(filePath);}}}//加载XML文件并显示在gridControl1private void LoadXmlFile(string filePath){try{projects.Clear(); // 清空现有项目列表XDocument doc = XDocument.Load(filePath);// 初始化DataTableDataTable dataTable = new DataTable();dataTable.Columns.Add("项目名称");dataTable.Columns.Add("流程名称");foreach (var projectElement in doc.Root.Elements("Project")){string projectName = projectElement.Attribute("name")?.Value;var project = new ProjectParams{Name = projectName,};foreach (var processElement in projectElement.Elements("process")){string processName = processElement.Attribute("name")?.Value;string displayText = processElement.Element("param")?.Attribute("value")?.Value;project.Processes.Add(new Process{Name = processName,DisplayText = displayText});// 添加到DataTabledataTable.Rows.Add(projectName, processName);}projects.Add(project);}gridControl1.DataSource = dataTable;// 强制生成列gridView1.PopulateColumns();// 现在再设置合并单元格gridView1.OptionsView.AllowCellMerge = true;gridView1.Columns["项目名称"].OptionsColumn.AllowMerge = DevExpress.Utils.DefaultBoolean.True;gridView1.Columns["流程名称"].OptionsColumn.AllowMerge = DevExpress.Utils.DefaultBoolean.False;gridView1.BestFitColumns();MessageBox.Show($"成功加载配置文件,共 {projects.Count} 个项目", "成功",MessageBoxButtons.OK, MessageBoxIcon.Information);}catch (Exception ex){MessageBox.Show($"加载XML文件失败: {ex.Message}", "错误",MessageBoxButtons.OK, MessageBoxIcon.Error);}}//根据流程配置.xml,运行各项private void button_start_Click(object sender, EventArgs e){if (projects.Count == 0){MessageBox.Show("请先选择流程配置文件", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);return;}textBox1.Clear();textBox1.AppendText("开始执行流程:" + "\r\n");textBox1.AppendText("====================" + "\r\n");foreach (var project in projects){textBox1.AppendText($"项目: {project.Name}" + "\r\n");foreach (var process in project.Processes){textBox1.AppendText($" → {process.DisplayText}" + "\r\n");// 这里可以添加实际的业务逻辑Thread.Sleep(1000);Application.DoEvents(); // 让UI能够更新}textBox1.AppendText("\r\n");}textBox1.AppendText("所有流程执行完成!" + "\r\n");}}//构造xml数据格式public class ProjectParams{public string Name { get; set; }public List<Process> Processes { get; set; } = new List<Process>();}public class Process{public string Name { get; set; }public string DisplayText { get; set; }}public static class GlobalVariables{public static string newname { get; set; } = "项目1";}
}
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 System.Xml.Linq;
using System.IO;namespace testProcess
{public partial class designprocess : Form{private DataTable dataTable;private int _rightClickedRowHandle = -1;public designprocess(){InitializeComponent();Load += Initialize_gridControl;// 绑定右键菜单事件gridView1.PopupMenuShowing += GridView1_PopupMenuShowing;gridView1.MouseDown += GridView1_MouseDown;}private void GridView1_MouseDown(object sender, MouseEventArgs e){if (e.Button == MouseButtons.Right){var hitInfo = gridView1.CalcHitInfo(e.Location);if (hitInfo.InRow){_rightClickedRowHandle = hitInfo.RowHandle;}}}private void GridView1_PopupMenuShowing(object sender, DevExpress.XtraGrid.Views.Grid.PopupMenuShowingEventArgs e){if (e.HitInfo.InRow){_rightClickedRowHandle = e.HitInfo.RowHandle;e.Menu.Items.Clear();// 创建右键菜单项DevExpress.Utils.Menu.DXMenuItem menuItem;menuItem = new DevExpress.Utils.Menu.DXMenuItem("添加市场调研", 添加市场调研ToolStripMenuItem_Click);e.Menu.Items.Add(menuItem);menuItem = new DevExpress.Utils.Menu.DXMenuItem("添加产品设计", 添加产品设计ToolStripMenuItem_Click);e.Menu.Items.Add(menuItem);menuItem = new DevExpress.Utils.Menu.DXMenuItem("添加营销推广", 添加营销推广ToolStripMenuItem_Click);e.Menu.Items.Add(menuItem);menuItem = new DevExpress.Utils.Menu.DXMenuItem("添加主持会议", 添加主持会议ToolStripMenuItem_Click);e.Menu.Items.Add(menuItem);menuItem = new DevExpress.Utils.Menu.DXMenuItem("添加产线升级", 添加产线升级ToolStripMenuItem_Click);e.Menu.Items.Add(menuItem);e.Menu.Items.Add(new DevExpress.Utils.Menu.DXMenuItem("-"));// 添加删除流程菜单项menuItem = new DevExpress.Utils.Menu.DXMenuItem("删除流程", 删除流程ToolStripMenuItem_Click);e.Menu.Items.Add(menuItem);e.Menu.Items.Add(new DevExpress.Utils.Menu.DXMenuItem("-"));menuItem = new DevExpress.Utils.Menu.DXMenuItem("重命名项目", 重命名ToolStripMenuItem_Click);e.Menu.Items.Add(menuItem);}}//根据选择,导出配置文件xmlprivate void button_save_Click(object sender, EventArgs e){using (SaveFileDialog saveFileDialog = new SaveFileDialog()){saveFileDialog.Filter = "XML文件|*.xml";saveFileDialog.Title = "导出流程配置";if (saveFileDialog.ShowDialog() == DialogResult.OK){ExportToXml(saveFileDialog.FileName);this.Close();}}}private void ExportToXml(string filePath){try{XElement root = new XElement("root");// 按项目名称分组var projects = dataTable.AsEnumerable().GroupBy(row => new{ProjectName = row.Field<string>("项目名称"),});foreach (var projectGroup in projects){XElement projectElement = new XElement("Project",new XAttribute("name", projectGroup.Key.ProjectName));foreach (var row in projectGroup){string processName = row.Field<string>("项目流程");string displayText = GetDisplayTextByProcessName(processName);XElement processElement = new XElement("process",new XAttribute("name", processName));XElement paramElement = new XElement("param",new XAttribute("name", "text"),new XAttribute("value", displayText));processElement.Add(paramElement);projectElement.Add(processElement);}root.Add(projectElement);}XDocument doc = new XDocument(root);doc.Save(filePath);}catch (Exception ex){MessageBox.Show($"导出XML失败: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);}}// 根据流程名称获取显示文本private string GetDisplayTextByProcessName(string processName){switch (processName){case "市场调研": return "开始市场调研";case "产品设计": return "开始产品设计";case "营销推广": return "开始营销推广";case "主持会议": return "开始主持会议";case "产线升级": return "开始产线升级";default: return $"开始{processName}";}}//初始化表格private void Initialize_gridControl(object sender, EventArgs e){gridView1.Columns.Clear();dataTable = new DataTable();dataTable.Columns.Add("项目名称");dataTable.Columns.Add("项目流程");dataTable.Columns.Add("显示文本"); // 新增列用于存储显示文本// 添加示例数据dataTable.Rows.Add("项目1", "市场调研", "开始市场调研");dataTable.Rows.Add("项目1", "营销推广", "开始营销推广");gridControl1.DataSource = dataTable;// 设置合并单元格 - 只合并项目名称列gridView1.OptionsView.AllowCellMerge = true;gridView1.Columns["项目名称"].OptionsColumn.AllowMerge = DevExpress.Utils.DefaultBoolean.True;gridView1.Columns["项目流程"].OptionsColumn.AllowMerge = DevExpress.Utils.DefaultBoolean.False;gridView1.Columns["显示文本"].OptionsColumn.AllowMerge = DevExpress.Utils.DefaultBoolean.False;// 隐藏显示文本列gridView1.Columns["显示文本"].Visible = false;gridView1.BestFitColumns();}#region 右键菜单事件处理// 删除流程功能private void 删除流程ToolStripMenuItem_Click(object sender, EventArgs e){if (_rightClickedRowHandle >= 0 && _rightClickedRowHandle < gridView1.RowCount){DataRow clickedRow = gridView1.GetDataRow(_rightClickedRowHandle);if (clickedRow != null){string projectName = clickedRow.Field<string>("项目名称");string processName = clickedRow.Field<string>("项目流程");// 确认删除DialogResult result = MessageBox.Show($"确定要删除项目 '{projectName}' 中的流程 '{processName}' 吗?","确认删除",MessageBoxButtons.YesNo,MessageBoxIcon.Question);if (result == DialogResult.Yes){// 获取当前项目的所有行var projectRows = dataTable.AsEnumerable().Where(row => row.Field<string>("项目名称") == projectName).ToList();// 如果要删除的行是当前项目的唯一流程,则提示不能删除if (projectRows.Count <= 1){MessageBox.Show("每个项目必须至少保留一个流程!", "提示",MessageBoxButtons.OK, MessageBoxIcon.Warning);return;}// 删除行dataTable.Rows.Remove(clickedRow);gridControl1.RefreshDataSource();MessageBox.Show("流程删除成功!", "成功",MessageBoxButtons.OK, MessageBoxIcon.Information);}}}}private void AddProcess(string processName, string displayText){if (_rightClickedRowHandle >= 0 && _rightClickedRowHandle < gridView1.RowCount){DataRow clickedRow = gridView1.GetDataRow(_rightClickedRowHandle);if (clickedRow != null){string projectName = clickedRow.Field<string>("项目名称");// 找到当前项目的最后一行var projectRows = dataTable.AsEnumerable().Where(row => row.Field<string>("项目名称") == projectName).ToList();int insertIndex;if (projectRows.Count > 0){// 在项目的最后一行之后插入DataRow lastRow = projectRows[projectRows.Count - 1];insertIndex = dataTable.Rows.IndexOf(lastRow) + 1;}else{// 如果项目没有行(理论上不会发生),在最后插入insertIndex = dataTable.Rows.Count;}// 创建新行DataRow newRow = dataTable.NewRow();newRow["项目名称"] = projectName;newRow["项目流程"] = processName;newRow["显示文本"] = displayText;// 在正确位置插入新行dataTable.Rows.InsertAt(newRow, insertIndex);gridControl1.RefreshDataSource();}}}private void 添加市场调研ToolStripMenuItem_Click(object sender, EventArgs e){AddProcess("市场调研", "开始市场调研");}private void 添加产品设计ToolStripMenuItem_Click(object sender, EventArgs e){AddProcess("产品设计", "开始产品设计");}private void 添加营销推广ToolStripMenuItem_Click(object sender, EventArgs e){AddProcess("营销推广", "开始营销推广");}private void 添加主持会议ToolStripMenuItem_Click(object sender, EventArgs e){AddProcess("主持会议", "开始主持会议");}private void 添加产线升级ToolStripMenuItem_Click(object sender, EventArgs e){AddProcess("产线升级", "开始产线升级");}private void 重命名ToolStripMenuItem_Click(object sender, EventArgs e){rename rename1 = new rename();rename1.ShowDialog();if (_rightClickedRowHandle >= 0){DataRow clickedRow = gridView1.GetDataRow(_rightClickedRowHandle);if (clickedRow != null){string currentName = clickedRow.Field<string>("项目名称");string newName = GlobalVariables.newname;if (!string.IsNullOrEmpty(newName) && newName != currentName){// 更新同一项目的所有行的项目名称foreach (DataRow row in dataTable.Rows){if (row.Field<string>("项目名称") == currentName){row["项目名称"] = newName;}}gridControl1.RefreshDataSource();}}}}#endregion}
}
运行后:

