From dc18021539bdf4ee176ec9d9b88eb7d9ad581600 Mon Sep 17 00:00:00 2001
From: C3204 <zhengyabo@lanpucloud.cn>
Date: 星期五, 17 四月 2026 17:00:35 +0800
Subject: [PATCH] 新增心跳等常规信号配置&&修改相机轴读取配置等
---
LB_SmartVision/Forms/Pages/MotionControlPage/MotionControlFormRead.cs | 415 ++++++++++++++++++++++-------------------------------------
1 files changed, 156 insertions(+), 259 deletions(-)
diff --git a/LB_SmartVision/Forms/Pages/MotionControlPage/MotionControlFormRead.cs b/LB_SmartVision/Forms/Pages/MotionControlPage/MotionControlFormRead.cs
index 505e9f1..2246dc2 100644
--- a/LB_SmartVision/Forms/Pages/MotionControlPage/MotionControlFormRead.cs
+++ b/LB_SmartVision/Forms/Pages/MotionControlPage/MotionControlFormRead.cs
@@ -1,6 +1,9 @@
锘縰sing LB_SmartVisionCommon;
using LB_VisionControls;
using LB_VisionProcesses.Cameras;
+using LB_VisionProcesses.Communicators;
+using LB_VisionProcesses.Communicators.SiemensS7;
+using OpenVinoSharp.Extensions.model;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
@@ -31,6 +34,13 @@
private BindingSource _bindingSource;
+ private PlcConfig config;
+ private DataTable signalTable;
+ private BindingSource bindingSource;
+ private string Name;
+
+
+
UserPictureBox onlinePictureBox { get; set; }
string communicatorsName { get; set; }
public MotionControlFormRead()
@@ -39,187 +49,23 @@
}
string cameraSN = string.Empty;
- public MotionControlFormRead(List<string> strCameraSN)
+ public MotionControlFormRead(string strCameraSN)
{
InitializeComponent();
- if (strCameraSN == null || strCameraSN.Count == 0)
+ if (string.IsNullOrEmpty(strCameraSN))
{
return;
}
-
- //this.camera = camera;
- //this.Text = camera.SN;
this.cmbSN.Items.Clear();
- foreach (string strSN in strCameraSN)
- {
- this.cmbSN.Items.Add(strSN);
- }
- //cameraSN = camera.SN;
+ this.cmbSN.Items.Add(strCameraSN);
onlinePictureBox = new UserPictureBox(uiGroupBoxImage);
this.uiGroupBoxImage.Controls.Clear();
this.uiGroupBoxImage.Controls.Add(onlinePictureBox);
onlinePictureBox.Dock = DockStyle.Fill;
- dataGridView1.Columns["SN"].HeaderText = "搴忓垪鍙�";
- dataGridView1.Columns["SN"].ReadOnly = true;
- dataGridView1.Columns["ReadAddress"].HeaderText = "璇诲彇PLC鍦板潃";
- //dataGridView1.Columns["ReadAddress"].ReadOnly = true;
- dataGridView1.Columns["WriteAddress"].HeaderText = "鍐欏叆PLC鍦板潃";
- //dataGridView1.Columns["WriteAddress"].ReadOnly = true;
- dataGridView1.Columns["Value"].HeaderText = "鏁板��";
- dataGridView1.Columns["Description"].HeaderText = "鎻忚堪";
- dataGridView1.Columns["Value"].DefaultCellStyle.Format = "F2"; // 淇濈暀涓や綅灏忔暟
-
-
+ LoadConfigAndSetupGrid();
}
- Dictionary<string, RecordMotionControlData> concurrentDictionary = new Dictionary<string, RecordMotionControlData>();
- private void CameraForm_FormClosing(object sender, FormClosingEventArgs e)
- {
- if (GlobalVar.dicCameras[this.cmbSN.Text] == null)
- {
- return;
- }
-
- GlobalVar.dicCameras[this.cmbSN.Text].StopGrabbing();
-
- GlobalVar.dicCameras[this.cmbSN.Text].StartGrabbing();
- if (GlobalVar.dicMotionControlData.Keys.Contains(GlobalVar.strProductName))
- {
- concurrentDictionary = GlobalVar.dicMotionControlData[GlobalVar.strProductName];
- double xAxisDetectLocationValue, xAxisOriginalLocationValue, yAxisDetectLocationValue, yAxisOriginalLocationValue, zAxisDetectLocationValue, zAxisOriginalLocationValue, wAxisDetectLocationValue, wAxisOriginalLocationValue, pulseMotionSpeedValue, angularVelocityValue;
- //xAxisDetectLocationValue = double.Parse(this.textBoxXDetectLocation.Text);
- //xAxisOriginalLocationValue = double.Parse(this.textBoxXOriginalLocation.Text);
- //yAxisDetectLocationValue = double.Parse(this.textBoxYDetectLocation.Text);
- //yAxisOriginalLocationValue = double.Parse(this.textBoxYOriginalLocation.Text);
- //zAxisDetectLocationValue = double.Parse(this.textBoxZDetectLocation.Text);
- //zAxisOriginalLocationValue = double.Parse(this.textBoxZOriginalLocation.Text);
- //wAxisDetectLocationValue = double.Parse(this.textBoxWDetectLocation.Text);
- //wAxisOriginalLocationValue = double.Parse(this.textBoxWOriginalLocation.Text);
- //pulseMotionSpeedValue = double.Parse(this.textBoxPointSpeed.Text);
- //angularVelocityValue = double.Parse(this.textBoxPointSpeed.Text);
- if (concurrentDictionary.Keys.Contains(cameraSN))
- {
- //RecordMotionControlData recordMotionControlData = new RecordMotionControlData
- //{
- // ProductName = GlobalVar.strProductName,
- // CommunicatorsName = communicatorsName,
- // CameraSN = cameraSN,
- // //XAxisAddress = this.textBoxXVarAddress.Text,
- // //XAxisDetectLocationValue = xAxisDetectLocationValue,
- // //XAxisOriginalLocationValue = xAxisOriginalLocationValue,
- // //YAxisAddress = this.textBoxYVarAddress.Text,
- // //YAxisDetectLocationValue = yAxisDetectLocationValue,
- // //YAxisOriginalLocationValue = yAxisOriginalLocationValue,
- // //ZAxisAddress = this.textBoxZVarAddress.Text,
- // //ZAxisDetectLocationValue = zAxisDetectLocationValue,
- // //ZAxisOriginalLocationValue = zAxisOriginalLocationValue,
- // //WAxisAddress = this.textBoxWVarAddress.Text,
- // //WAxisDetectLocationValue = wAxisDetectLocationValue,
- // //WAxisOriginalLocationValue = wAxisOriginalLocationValue,
- // //PulseMotionSpeedAddress = this.textBoxPulseMotionSpeedAddress.Text,
- // //PulseMotionSpeedValue = pulseMotionSpeedValue,
- // //AngularVelocityAddress = this.textBoxAngularVelocityAddress.Text,
- // //AngularVelocityValue = angularVelocityValue
- //};
- //concurrentDictionary.TryAdd(cameraSN, recordMotionControlData);
- }
- else
- {
- //RecordMotionControlData recordMotionControlData = new RecordMotionControlData
- //{
- // ProductName = GlobalVar.strProductName,
- // CommunicatorsName = communicatorsName,
- // CameraSN = cameraSN,
- // //XAxisAddress = this.textBoxXVarAddress.Text,
- // //XAxisDetectLocationValue = xAxisDetectLocationValue,
- // //XAxisOriginalLocationValue = xAxisOriginalLocationValue,
- // //YAxisAddress = this.textBoxYVarAddress.Text,
- // //YAxisDetectLocationValue = yAxisDetectLocationValue,
- // //YAxisOriginalLocationValue = yAxisOriginalLocationValue,
- // //ZAxisAddress = this.textBoxZVarAddress.Text,
- // //ZAxisDetectLocationValue = zAxisDetectLocationValue,
- // //ZAxisOriginalLocationValue = zAxisOriginalLocationValue,
- // //WAxisAddress = this.textBoxWVarAddress.Text,
- // //WAxisDetectLocationValue = wAxisDetectLocationValue,
- // //WAxisOriginalLocationValue = wAxisOriginalLocationValue,
- // //PulseMotionSpeedAddress = this.textBoxPulseMotionSpeedAddress.Text,
- // //PulseMotionSpeedValue = pulseMotionSpeedValue,
- // //AngularVelocityAddress = this.textBoxAngularVelocityAddress.Text,
- // //AngularVelocityValue = angularVelocityValue
- //};
- //concurrentDictionary.TryAdd(cameraSN, recordMotionControlData);
- }
- }
- else
- {
- double xAxisDetectLocationValue, xAxisOriginalLocationValue, yAxisDetectLocationValue, yAxisOriginalLocationValue, zAxisDetectLocationValue, zAxisOriginalLocationValue, wAxisDetectLocationValue, wAxisOriginalLocationValue, pulseMotionSpeedValue, angularVelocityValue;
- //xAxisDetectLocationValue = double.Parse(this.textBoxXDetectLocation.Text);
- //xAxisOriginalLocationValue = double.Parse(this.textBoxXOriginalLocation.Text);
- //yAxisDetectLocationValue = double.Parse(this.textBoxYDetectLocation.Text);
- //yAxisOriginalLocationValue = double.Parse(this.textBoxYOriginalLocation.Text);
- //zAxisDetectLocationValue = double.Parse(this.textBoxZDetectLocation.Text);
- //zAxisOriginalLocationValue = double.Parse(this.textBoxZOriginalLocation.Text);
- //wAxisDetectLocationValue = double.Parse(this.textBoxWDetectLocation.Text);
- //wAxisOriginalLocationValue = double.Parse(this.textBoxWOriginalLocation.Text);
- //pulseMotionSpeedValue = double.Parse(this.textBoxPointSpeed.Text);
- //angularVelocityValue = double.Parse(this.textBoxPointSpeed.Text);
- if (concurrentDictionary.Keys.Contains(cameraSN))
- {
- //RecordMotionControlData recordMotionControlData = new RecordMotionControlData
- //{
- // ProductName = GlobalVar.strProductName,
- // CommunicatorsName = communicatorsName,
- // CameraSN = cameraSN,
- // //XAxisAddress = this.textBoxXVarAddress.Text,
- // //XAxisDetectLocationValue = xAxisDetectLocationValue,
- // //XAxisOriginalLocationValue = xAxisOriginalLocationValue,
- // //YAxisAddress = this.textBoxYVarAddress.Text,
- // //YAxisDetectLocationValue = yAxisDetectLocationValue,
- // //YAxisOriginalLocationValue = yAxisOriginalLocationValue,
- // //ZAxisAddress = this.textBoxZVarAddress.Text,
- // //ZAxisDetectLocationValue = zAxisDetectLocationValue,
- // //ZAxisOriginalLocationValue = zAxisOriginalLocationValue,
- // //WAxisAddress = this.textBoxWVarAddress.Text,
- // //WAxisDetectLocationValue = wAxisDetectLocationValue,
- // //WAxisOriginalLocationValue = wAxisOriginalLocationValue,
- // //PulseMotionSpeedAddress = this.textBoxPulseMotionSpeedAddress.Text,
- // //PulseMotionSpeedValue = pulseMotionSpeedValue,
- // //AngularVelocityAddress = this.textBoxAngularVelocityAddress.Text,
- // //AngularVelocityValue = angularVelocityValue
- //};
- //concurrentDictionary.TryAdd(cameraSN, recordMotionControlData);
- }
- else
- {
- //RecordMotionControlData recordMotionControlData = new RecordMotionControlData
- //{
- // ProductName = GlobalVar.strProductName,
- // CommunicatorsName = communicatorsName,
- // CameraSN = cameraSN,
- // //XAxisAddress = this.textBoxXVarAddress.Text,
- // //XAxisDetectLocationValue = xAxisDetectLocationValue,
- // //XAxisOriginalLocationValue = xAxisOriginalLocationValue,
- // //YAxisAddress = this.textBoxYVarAddress.Text,
- // //YAxisDetectLocationValue = yAxisDetectLocationValue,
- // //YAxisOriginalLocationValue = yAxisOriginalLocationValue,
- // //ZAxisAddress = this.textBoxZVarAddress.Text,
- // //ZAxisDetectLocationValue = zAxisDetectLocationValue,
- // //ZAxisOriginalLocationValue = zAxisOriginalLocationValue,
- // //WAxisAddress = this.textBoxWVarAddress.Text,
- // //WAxisDetectLocationValue = wAxisDetectLocationValue,
- // //WAxisOriginalLocationValue = wAxisOriginalLocationValue,
- // //PulseMotionSpeedAddress = this.textBoxPulseMotionSpeedAddress.Text,
- // //PulseMotionSpeedValue = pulseMotionSpeedValue,
- // //AngularVelocityAddress = this.textBoxAngularVelocityAddress.Text,
- // //AngularVelocityValue = angularVelocityValue
- //};
- //concurrentDictionary.TryAdd(cameraSN, recordMotionControlData);
- }
- }
- GlobalVar.dicMotionControlData.TryAdd(GlobalVar.strProductName, concurrentDictionary);
- ConfigManager<Dictionary<string, Dictionary<string, RecordMotionControlData>>>.SaveConfig<Dictionary<string, Dictionary<string, RecordMotionControlData>>>(GlobalVar.dicMotionControlData, GlobalVar.allMotionControlDataPath);
- Unsubscribe();
- }
+ Dictionary<string, PlcConfig> concurrentDictionary = new Dictionary<string, PlcConfig>();
public void Unsubscribe()
{
@@ -344,123 +190,174 @@
private void btnAdd_Click(object sender, EventArgs e)
{
- // 鍒涘缓鏂板鏁版嵁鐨勫璇濇锛堣繖閲岀畝鍖栦负鐩存帴鍒涘缓榛樿鏁版嵁锛�
- PlcDataItem newData = new PlcDataItem
- {
- SN = (GlobalVar.dicMPlcData.Count()).ToString(),
- ReadAddress = "DB1003.DBD1",
- WriteAddress = "DB1003.DBD51",
- Value = 0.0F,
- Description = "璇蜂慨鏀瑰搴旀弿杩�"
- };
- // 娣诲姞鍒板祵濂楀瓧鍏�
- if (!GlobalVar.dicMPlcData.ContainsKey(newData.ReadAddress))
+ using (var configForm = new ConfigForm(config, GlobalVar.allPlcSettingPath + "\\" + this.Name + ".json"))
{
- GlobalVar.dicMPlcData.TryAdd(newData.ReadAddress, new Dictionary<string, PlcDataItem> { [newData.ReadAddress] = newData });
- }
- else
- {
- newData.ReadAddress = newData.ReadAddress + GlobalVar.dicMPlcData.Count;
- GlobalVar.dicMPlcData.TryAdd(newData.ReadAddress, new Dictionary<string, PlcDataItem> { [newData.ReadAddress] = newData });
- }
-
- // 鏇存柊DataGridView鏁版嵁婧�
- UpdateDataSource();
-
- // 閫変腑鏂板鐨勮
- dataGridView1.ClearSelection();
- var newRow = dataGridView1.Rows[dataGridView1.Rows.Count - 1];
- newRow.Selected = true;
- dataGridView1.FirstDisplayedScrollingRowIndex = newRow.Index;
- }
-
- /// <summary>
- /// 灏嗗祵濂楀瓧鍏歌浆鎹负瑙嗗浘妯″瀷骞舵洿鏂版暟鎹簮
- /// </summary>
- private void UpdateDataSource()
- {
- // 杞崲宓屽瀛楀吀涓烘墎骞崇殑瑙嗗浘妯″瀷鍒楄〃
- List<PlcDataItem> viewModelList = new List<PlcDataItem>();
- foreach (var group in GlobalVar.dicMPlcData)
- {
- foreach (var device in group.Value)
+ if (configForm.ShowDialog() == DialogResult.OK)
{
- var data = device.Value;
- viewModelList.Add(new PlcDataItem
- {
- SN = (GlobalVar.dicMPlcData.Count()).ToString(),
- ReadAddress = data.ReadAddress,
- WriteAddress = data.WriteAddress,
- Value = data.Value,
- Description = data.Description
- });
+ config = S7ConfigService.LoadConfig(GlobalVar.allPlcSettingPath);
+ LoadConfigAndSetupGrid();
+ UpdateConnectionStatus();
}
}
- _bindingSource.DataSource = viewModelList;
}
-
- private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
+ // 鏁版嵁绫诲瀷杞崲杈呭姪鏂规硶
+ private object ConvertValue(string dataType, string valueStr)
{
- if (e.RowIndex < 0 || e.ColumnIndex < 0)
+ switch (dataType)
{
- return;
+ case "Bool":
+ {
+ if (bool.TryParse(valueStr, out bool b)) return b;
+ if (valueStr == "1") return true;
+ if (valueStr == "0") return false;
+ throw new Exception("鏃犳晥鐨勫竷灏斿��");
+ }
+ case "Byte":
+ {
+ return byte.Parse(valueStr);
+ }
+ case "Int":
+ {
+ return short.Parse(valueStr);
+ }
+ case "DInt":
+ {
+ return int.Parse(valueStr);
+ }
+ case "Real":
+ {
+ return float.Parse(valueStr);
+ }
+ case "String":
+ {
+ return valueStr;
+ }
+ default:
+ {
+ throw new NotSupportedException($"涓嶆敮鎸佺殑绫诲瀷: {dataType}");
+ }
}
-
- // 鑾峰彇淇敼鍚庣殑瑙嗗浘妯″瀷
- var modifiedModel = (PlcDataItem)_bindingSource.List[e.RowIndex];
-
- // 鏇存柊鍘熷瀛楀吀鏁版嵁
- if (GlobalVar.dicMPlcData.ContainsKey(modifiedModel.SN))
- {
- var originalData = GlobalVar.dicMPlcData[modifiedModel.SN][GlobalVar.dicMPlcData[modifiedModel.SN].Keys.ToList()[0]];
-
- // 鍚屾淇敼鍚庣殑鍊�
- originalData.SN = modifiedModel.SN;
- originalData.ReadAddress = modifiedModel.ReadAddress;
- originalData.WriteAddress = modifiedModel.WriteAddress;
- originalData.Value = modifiedModel.Value;
- originalData.Description = modifiedModel.Description;
- GlobalVar.dicMPlcData[modifiedModel.SN] = new Dictionary<string, PlcDataItem> { [originalData.SN] = originalData };
- }
-
}
-
- private void btnRemove_Click(object sender, EventArgs e)
+ private void LoadConfigAndSetupGrid()
{
- if (dataGridView1.SelectedRows.Count == 0)
+ config = S7ConfigService.LoadConfig(GlobalVar.allPlcSettingPath + "\\" + this.Name + ".json");
+
+ if (GlobalVar.allPlcSettings.Keys.Contains(Name))
{
- System.Windows.Forms.MessageBox.Show("璇峰厛閫変腑瑕佸垹闄ょ殑琛岋紒");
- return;
- }
-
- // 鑾峰彇閫変腑琛岀殑瑙嗗浘妯″瀷
- var selectedModel = (PlcDataItem)dataGridView1.SelectedRows[0].DataBoundItem;
-
- // 浠庡祵濂楀瓧鍏镐腑鍒犻櫎瀵瑰簲鏁版嵁
- if (GlobalVar.dicMPlcData.ContainsKey(selectedModel.SN))
- {
- GlobalVar.dicMPlcData.Remove(selectedModel.SN);
-
- // 鏇存柊DataGridView鏁版嵁婧�
- UpdateDataSource();
- System.Windows.Forms.MessageBox.Show("鍒犻櫎鎴愬姛锛�");
+ GlobalVar.allPlcSettings[Name] = config;
}
else
{
- System.Windows.MessageBox.Show("鏈壘鍒板搴旀暟鎹紝鍒犻櫎澶辫触锛�");
+ GlobalVar.allPlcSettings.TryAdd(Name, config);
+ }
+ ConfigManager<Dictionary<string, Dictionary<string, PlcConfig>>>.SaveConfig<Dictionary<string, Dictionary<string, PlcConfig>>>(GlobalVar.dicMPlcData, GlobalVar.allMPlcDataPath);
+ // 鏋勫缓 DataTable 鐢ㄤ簬灞曠ず淇″彿锛堟敮鎸佺紪杈戝�煎垪锛�
+ signalTable = new DataTable();
+ signalTable.Columns.Add("SignalName", typeof(string));
+ signalTable.Columns.Add("Address", typeof(string));
+ signalTable.Columns.Add("Value", typeof(string));
+
+ foreach (var signal in config.Signals)
+ {
+ string address = $"{signal.Area}";
+ if (signal.Area == "DB")
+ address += $"{signal.DbNumber}.DB";
+ address += $"{signal.ByteOffset}.{signal.BitOffset}";
+
+ signalTable.Rows.Add(signal.SignalName, address, "");
+ }
+
+ bindingSource = new BindingSource();
+ bindingSource.DataSource = signalTable;
+ dgvSignals.DataSource = bindingSource;
+
+ dgvSignals.Columns["SignalName"].HeaderText = "淇″彿鍚嶇О";
+ dgvSignals.Columns["SignalName"].ReadOnly = true;
+ dgvSignals.Columns["Address"].HeaderText = "PLC 鍦板潃";
+ dgvSignals.Columns["Address"].ReadOnly = true;
+ dgvSignals.Columns["Value"].HeaderText = "褰撳墠鍊�";
+ dgvSignals.Columns["Value"].ReadOnly = true; // 鍏佽鐢ㄦ埛缂栬緫
+
+ UpdateConnectionStatus();
+ dgvSignals.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
+ dgvSignals.ForeColor = Color.Black;
+ }
+
+ private void UpdateConnectionStatus()
+ {
+ if (((SiemensLBS7)GlobalVar.dicCommunicators[GlobalVar.currentCommunicators]) != null && ((SiemensLBS7)GlobalVar.dicCommunicators[GlobalVar.currentCommunicators]).bConnected)
+ {
+ lblStatus.Text = $"宸茶繛鎺�: {config.PlcIpAddress}";
+ lblStatus.ForeColor = Color.Green;
+ }
+ else
+ {
+ lblStatus.Text = "鏈繛鎺�";
+ lblStatus.ForeColor = Color.Red;
}
}
private void btnOneClickRead_Click(object sender, EventArgs e)
{
+ if (((SiemensLBS7)GlobalVar.dicCommunicators[GlobalVar.currentCommunicators]) == null || !((SiemensLBS7)GlobalVar.dicCommunicators[GlobalVar.currentCommunicators]).bConnected)
+ {
+ System.Windows.Forms.MessageBox.Show("璇峰厛杩炴帴 PLC", "鎻愮ず", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+ return;
+ }
+ try
+ {
+ for (int i = 0; i < config.Signals.Count; i++)
+ {
+ var signal = config.Signals[i];
+ object value = ((SiemensLBS7)GlobalVar.dicCommunicators[GlobalVar.currentCommunicators]).ReadSignal(signal);
+ config.Signals[i].Value = value?.ToString() ?? "";
+ signalTable.Rows[i]["Value"] = config.Signals[i].Value;
+ //ShowLogMsg(signalTable.Rows[i]["Value"] + "锛�" + value?.ToString() ?? "");
+ }
+ }
+ catch (Exception ex)
+ {
+ System.Windows.Forms.MessageBox.Show($"鎵归噺璇诲彇澶辫触: {ex.Message}", "閿欒", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
}
private void btnOneClickSetting_Click(object sender, EventArgs e)
{
+ if (((SiemensLBS7)GlobalVar.dicCommunicators[GlobalVar.currentCommunicators]) == null || !((SiemensLBS7)GlobalVar.dicCommunicators[GlobalVar.currentCommunicators]).bConnected)
+ {
+ System.Windows.Forms.MessageBox.Show("璇峰厛杩炴帴 PLC", "鎻愮ず", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+ return;
+ }
+ try
+ {
+ int successCount = 0;
+ for (int i = 0; i < config.Signals.Count; i++)
+ {
+ var signal = config.Signals[i];
+ string newValueStr = signalTable.Rows[i]["Value"]?.ToString();
+ if (!string.IsNullOrEmpty(newValueStr))
+ {
+ object convertedValue = ConvertValue(signal.DataType, newValueStr);
+ ((SiemensLBS7)GlobalVar.dicCommunicators[GlobalVar.currentCommunicators]).WriteSignal(signal, convertedValue);
+ successCount++;
+ }
+ //ShowSendMsg(signalTable.Rows[i]["Value"] + "锛�" + newValueStr?.ToString() ?? "");
+ }
+ System.Windows.Forms.MessageBox.Show($"鎵归噺鍐欏叆瀹屾垚锛屾垚鍔熷啓鍏� {successCount} 涓俊鍙枫��", "鍐欏叆缁撴灉", MessageBoxButtons.OK, MessageBoxIcon.Information);
+ }
+ catch (Exception ex)
+ {
+ System.Windows.Forms.MessageBox.Show($"鎵归噺鍐欏叆澶辫触: {ex.Message}", "閿欒", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+
+ private void btnSave_Click(object sender, EventArgs e)
+ {
+ LoadConfigAndSetupGrid();
}
}
}
--
Gitblit v1.9.3