refactor: 插件 UI 从 WinForms 迁移到 CycleGUI,并修复代码质量问题
将 StandardScene 各插件的配置/监控窗体从 WinForms 迁移到 CycleGUI(删除 .Designer.cs/.resx,重写为 PanelBuilder 立即模式 UI,新增 CycleUiHelper 统一对话框)。 同时修复代码审核中的问题: - 后台文件写入加锁 + try/catch(ButtonBoxManager / DoorManager,对齐 LoopViewer.SaveTasks 模式) - CoderFieldsMetadata.cs 启用 #nullable enable,消除 CS8632 警告 - DummyCar 移除已废弃的 rightClickAction()/SetPosition() - CarRemoteHelper.OpenVehicleWebPage 的 Process.Start 加 try/catch - 重命名名不副实的 Mstsc()(现为打开网页) - 统一弃元命名为 _ - TrafficInterlockViewer 改用稳定 Id(GUID)做选择/编辑,替代行索引 - csproj 改用 $(CGUILibDir) 解析 CycleGUI,绝对路径收敛到 Directory.Build.props 构建:dotnet build StandardScene.sln → 0 错误,30 警告(均为历史遗留)。 注:static 单例状态重构(审核第 8 项)暂未处理,留待单独任务。
This commit is contained in:
@@ -1,235 +1,336 @@
|
||||
using Newtonsoft.Json;
|
||||
using StandardScene.InterLock; // 数据类型采用 TrafficInterlockMission 中的 TrafficArea
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Drawing;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Windows.Forms;
|
||||
using System.Threading.Tasks;
|
||||
using CycleGUI;
|
||||
using Newtonsoft.Json;
|
||||
using StandardScene.InterLock;
|
||||
using StandardScene.Utils;
|
||||
|
||||
namespace LoopViewerApp
|
||||
{
|
||||
public partial class TrafficInterlockViewer : Form
|
||||
/// <summary>
|
||||
/// 交通联锁区域管理界面(CycleGUI 版,替代原 WinForms <c>TrafficInterlockViewer</c> 窗体)。
|
||||
/// <list type="bullet">
|
||||
/// <item>维护 <see cref="TrafficInterlockMission.TrafficAreaList"/> 的增 / 改 / 删,并写入 <c>Config/traffic.json</c>。</item>
|
||||
/// <item>单实例:再次打开则把已有面板置前。</item>
|
||||
/// <item>勾选多行后「删除选中」可批量删除;每行「编辑」按钮加载下方编辑区。</item>
|
||||
/// <item>文件写入放后台线程,绝不阻塞渲染线程。</item>
|
||||
/// </list>
|
||||
/// 沿用 <c>LoopViewer</c> / <c>DeliveryViewer</c> 同套模式(单实例面板、<c>pb.Table</c>、<c>CycleUiHelper.ConfirmThen</c>)。
|
||||
/// 保留可实例化 + <see cref="Show"/> 以兼容既有调用 <c>new TrafficInterlockViewer().Show()</c>。
|
||||
/// </summary>
|
||||
public class TrafficInterlockViewer
|
||||
{
|
||||
/// <summary>-1 表示新增模式;>=0 表示正在编辑对应索引</summary>
|
||||
private int _editingIndex = -1;
|
||||
private const string TableId = "traffic-area-list";
|
||||
|
||||
/// <summary>选中行变化时是否允许加载到编辑区(避免在保存/取消时重复刷新)</summary>
|
||||
private bool _allowLoadFromSelection = true;
|
||||
private static string JsonPath =>
|
||||
Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Config", "traffic.json");
|
||||
|
||||
public TrafficInterlockViewer()
|
||||
private static readonly object SaveLock = new object();
|
||||
|
||||
private static Panel _panel;
|
||||
private static string _editingAreaId = "";
|
||||
private static readonly HashSet<string> _selected = new HashSet<string>(StringComparer.Ordinal);
|
||||
|
||||
private static string _areaName = "";
|
||||
private static string _stationIds = "";
|
||||
private static string _controlRight = "";
|
||||
private static bool _isOccupied;
|
||||
private static bool _isEnabled = true;
|
||||
private static string _editingHint = "新增区域";
|
||||
private static string _editErr = "";
|
||||
private static volatile string _status = "";
|
||||
|
||||
/// <summary>打开(或置前)区域管理面板。兼容原 <c>new TrafficInterlockViewer().Show()</c> 调用方式。</summary>
|
||||
public void Show() => Open();
|
||||
|
||||
/// <summary>打开(或置前)区域管理面板。</summary>
|
||||
public static void Open()
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
if (LicenseManager.UsageMode == LicenseUsageMode.Designtime)
|
||||
return;
|
||||
|
||||
try
|
||||
if (_panel != null)
|
||||
{
|
||||
RenderListView();
|
||||
ClearPanelInputs();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
System.Diagnostics.Debug.WriteLine($"TrafficInterlockViewer init error: {ex}");
|
||||
}
|
||||
}
|
||||
|
||||
#region 表格绘制(只读展示)
|
||||
|
||||
private void lstTasks_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e)
|
||||
{
|
||||
try
|
||||
{
|
||||
// 与 LoopViewer 一致:深蓝表头 + 白色加粗字体
|
||||
using (var backBrush = new SolidBrush(Color.FromArgb(63, 81, 181)))
|
||||
using (var textBrush = new SolidBrush(Color.White))
|
||||
using (var font = new Font("微软雅黑", 9, FontStyle.Bold))
|
||||
try
|
||||
{
|
||||
e.Graphics.FillRectangle(backBrush, e.Bounds);
|
||||
var sf = new StringFormat { LineAlignment = StringAlignment.Center, Alignment = StringAlignment.Near };
|
||||
var rect = e.Bounds;
|
||||
rect.Inflate(-8, 0);
|
||||
e.Graphics.DrawString(e.Header.Text, font, textBrush, rect, sf);
|
||||
using (var pen = new Pen(Color.FromArgb(200, 200, 200)))
|
||||
e.Graphics.DrawLine(pen, e.Bounds.Left, e.Bounds.Bottom - 1, e.Bounds.Right, e.Bounds.Bottom - 1);
|
||||
_panel.BringToFront();
|
||||
return;
|
||||
}
|
||||
catch
|
||||
{
|
||||
_panel = null;
|
||||
}
|
||||
}
|
||||
catch
|
||||
|
||||
ClearPanelInputs();
|
||||
|
||||
var panel = GUI.DeclarePanel()
|
||||
.ShowTitle("交通联锁区域管理")
|
||||
.SetDefaultDocking(Panel.Docking.None)
|
||||
.InitSize(800, 680)
|
||||
.InitPos(false, 0, 0, 0.5f, 0.5f, 0.5f, 0.5f);
|
||||
_panel = panel;
|
||||
panel.IfTerminalQuit(() => { if (_panel == panel) _panel = null; });
|
||||
|
||||
panel.Define(pb =>
|
||||
{
|
||||
e.DrawBackground();
|
||||
e.DrawText();
|
||||
}
|
||||
if (pb.Closing())
|
||||
{
|
||||
panel.Exit();
|
||||
_panel = null;
|
||||
return;
|
||||
}
|
||||
|
||||
List<TrafficArea> areas;
|
||||
lock (TrafficInterlockMission.TrafficAreaList)
|
||||
{
|
||||
EnsureAreaIdsLocked();
|
||||
areas = TrafficInterlockMission.TrafficAreaList.ToList();
|
||||
}
|
||||
_selected.RemoveWhere(id => areas.All(a => a.Id != id));
|
||||
if (!string.IsNullOrEmpty(_editingAreaId) && areas.All(a => a.Id != _editingAreaId))
|
||||
ClearPanelInputs();
|
||||
|
||||
if (pb.Button("删除选中", distinct: "traffic-del-selected"))
|
||||
ConfirmDeleteSelected();
|
||||
pb.SameLine(12);
|
||||
if (pb.Button("刷新", distinct: "traffic-refresh"))
|
||||
{
|
||||
_status = "";
|
||||
_editErr = "";
|
||||
}
|
||||
pb.SameLine(12);
|
||||
pb.Label($"共 {areas.Count} 个区域,已选 {_selected.Count} 个");
|
||||
|
||||
pb.Table(TableId,
|
||||
new[] { "选择", "区域名称", "区域站点集合", "控制权", "是否被占用", "是否启用", "操作" },
|
||||
areas.Count, (row, i) =>
|
||||
{
|
||||
var a = areas[i];
|
||||
var areaId = EnsureAreaId(a);
|
||||
|
||||
var sel = _selected.Contains(areaId);
|
||||
if (row.Checkbox(ref sel, "勾选以批量删除"))
|
||||
{
|
||||
if (sel) _selected.Add(areaId);
|
||||
else _selected.Remove(areaId);
|
||||
}
|
||||
|
||||
row.Label(a.AreaName ?? "");
|
||||
row.Label(a.SiteList != null && a.SiteList.Count > 0
|
||||
? string.Join(", ", a.SiteList)
|
||||
: "");
|
||||
row.Label(a.ControllerName ?? "");
|
||||
row.Label(a.IsOccupy ? "是" : "否");
|
||||
row.Label(a.IsEnable ? "是" : "否");
|
||||
|
||||
if (row.ButtonGroup(new[] { "编辑" }, new[] { "编辑该区域" }) == 0)
|
||||
{
|
||||
_editingAreaId = areaId;
|
||||
LoadAreaToFields(a);
|
||||
}
|
||||
}, height: 14, enableSearch: true);
|
||||
|
||||
pb.Separator();
|
||||
pb.Label("数据新增/编辑(点击表格行「编辑」可在此查看并修改该行数据)");
|
||||
pb.Label(_editingHint);
|
||||
|
||||
var (name, _) = pb.TextInput("1. 区域名称", _areaName, alwaysReturnString: true);
|
||||
_areaName = name;
|
||||
var (sites, _) = pb.TextInput("2. 站点集合 (逗号/分号/空格分隔)", _stationIds, alwaysReturnString: true);
|
||||
_stationIds = sites;
|
||||
var (ctrl, _) = pb.TextInput("3. 控制权", _controlRight, alwaysReturnString: true);
|
||||
_controlRight = ctrl;
|
||||
pb.CheckBox("4. 是否被占用", ref _isOccupied);
|
||||
pb.SameLine(16);
|
||||
pb.CheckBox("5. 是否启用", ref _isEnabled);
|
||||
|
||||
if (!string.IsNullOrEmpty(_editErr))
|
||||
{
|
||||
pb.Separator();
|
||||
pb.Label(_editErr);
|
||||
}
|
||||
|
||||
pb.Separator();
|
||||
if (pb.Button("保存", distinct: "traffic-save"))
|
||||
SaveArea();
|
||||
pb.SameLine(12);
|
||||
if (pb.Button("新增", distinct: "traffic-new"))
|
||||
{
|
||||
_selected.Clear();
|
||||
ClearPanelInputs();
|
||||
}
|
||||
|
||||
if (!string.IsNullOrEmpty(_status))
|
||||
{
|
||||
pb.Separator();
|
||||
pb.Label(_status);
|
||||
}
|
||||
|
||||
pb.Panel.Repaint(repaintTimeMs: 500);
|
||||
});
|
||||
}
|
||||
|
||||
private void lstTasks_DrawItem(object sender, DrawListViewItemEventArgs e)
|
||||
private static void ConfirmDeleteSelected()
|
||||
{
|
||||
// 由 DrawSubItem 统一绘制
|
||||
if (_selected.Count == 0)
|
||||
{
|
||||
_status = "请先在上方列表中选择要删除的区域。";
|
||||
_panel?.Repaint();
|
||||
return;
|
||||
}
|
||||
|
||||
string prompt = _selected.Count == 1
|
||||
? "确定要删除选中的区域吗?"
|
||||
: $"确定要删除所选 {_selected.Count} 个区域吗?";
|
||||
|
||||
CycleUiHelper.ConfirmThen(prompt, DeleteSelected);
|
||||
}
|
||||
|
||||
private void lstTasks_DrawSubItem(object sender, DrawListViewSubItemEventArgs e)
|
||||
private static void DeleteSelected()
|
||||
{
|
||||
var selectedIds = _selected.ToHashSet(StringComparer.Ordinal);
|
||||
var removed = 0;
|
||||
lock (TrafficInterlockMission.TrafficAreaList)
|
||||
{
|
||||
removed = TrafficInterlockMission.TrafficAreaList.RemoveAll(a => selectedIds.Contains(a.Id));
|
||||
}
|
||||
|
||||
_selected.Clear();
|
||||
SaveToConfig();
|
||||
ClearPanelInputs();
|
||||
_status = $"已删除 {removed} 个区域";
|
||||
_panel?.Repaint();
|
||||
}
|
||||
|
||||
private static void SaveArea()
|
||||
{
|
||||
try
|
||||
{
|
||||
bool selected = e.Item.Selected;
|
||||
Rectangle bounds = e.Bounds;
|
||||
// 与 LoopViewer 一致:选中行蓝色强调,交替行背景,深灰文字
|
||||
Color selectedBack = Color.FromArgb(0, 120, 215);
|
||||
Color selectedFore = Color.White;
|
||||
Color evenBack = Color.White;
|
||||
Color oddBack = Color.FromArgb(250, 251, 253);
|
||||
Color normalFore = Color.FromArgb(33, 33, 33);
|
||||
|
||||
if (selected)
|
||||
string areaName = (_areaName ?? "").Trim();
|
||||
if (string.IsNullOrEmpty(areaName))
|
||||
{
|
||||
using (var selBrush = new SolidBrush(selectedBack))
|
||||
e.Graphics.FillRectangle(selBrush, bounds);
|
||||
_editErr = "请输入区域名称。";
|
||||
_panel?.Repaint();
|
||||
return;
|
||||
}
|
||||
|
||||
var stationIds = ParseStationIds(_stationIds ?? "");
|
||||
string controlRight = (_controlRight ?? "").Trim();
|
||||
bool isOccupied = _isOccupied;
|
||||
bool isEnabled = _isEnabled;
|
||||
|
||||
if (!string.IsNullOrEmpty(_editingAreaId))
|
||||
{
|
||||
lock (TrafficInterlockMission.TrafficAreaList)
|
||||
{
|
||||
var existing = TrafficInterlockMission.TrafficAreaList
|
||||
.FirstOrDefault(a => string.Equals(a.Id, _editingAreaId, StringComparison.Ordinal));
|
||||
if (existing == null)
|
||||
{
|
||||
_editErr = "正在编辑的区域已不存在,请刷新后重试。";
|
||||
_panel?.Repaint();
|
||||
return;
|
||||
}
|
||||
|
||||
existing.AreaName = areaName;
|
||||
existing.SiteList = stationIds;
|
||||
existing.ControllerName = controlRight;
|
||||
existing.IsOccupy = isOccupied;
|
||||
existing.IsEnable = isEnabled;
|
||||
}
|
||||
_status = $"已保存区域:{areaName}";
|
||||
}
|
||||
else
|
||||
{
|
||||
using (var back = new SolidBrush(e.ItemIndex % 2 == 0 ? evenBack : oddBack))
|
||||
e.Graphics.FillRectangle(back, bounds);
|
||||
}
|
||||
|
||||
string text = e.SubItem?.Text ?? string.Empty;
|
||||
Color fore = selected ? selectedFore : normalFore;
|
||||
var textRect = bounds;
|
||||
textRect.Inflate(-6, 0);
|
||||
using (var font = new Font("微软雅黑", 9))
|
||||
TextRenderer.DrawText(e.Graphics, text, font, textRect, fore, TextFormatFlags.Left | TextFormatFlags.VerticalCenter);
|
||||
}
|
||||
catch
|
||||
{
|
||||
e.DrawBackground();
|
||||
e.DrawText();
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 列表渲染与保存
|
||||
|
||||
private void RenderListView()
|
||||
{
|
||||
try
|
||||
{
|
||||
if (lstTasks == null) return;
|
||||
_allowLoadFromSelection = false;
|
||||
lstTasks.BeginUpdate();
|
||||
lstTasks.Items.Clear();
|
||||
foreach (var a in TrafficInterlockMission.TrafficAreaList)
|
||||
{
|
||||
var stationStr = a.SiteList != null && a.SiteList.Count > 0 ? string.Join(", ", a.SiteList) : "";
|
||||
|
||||
var lvi = new ListViewItem(new[]
|
||||
lock (TrafficInterlockMission.TrafficAreaList)
|
||||
{
|
||||
a.AreaName ?? "",
|
||||
stationStr,
|
||||
a.ControllerName ?? "",
|
||||
a.IsOccupy ? "是" : "否",
|
||||
a.IsEnable ? "是" : "否"
|
||||
});
|
||||
|
||||
lstTasks.Items.Add(lvi);
|
||||
TrafficInterlockMission.TrafficAreaList.Add(new TrafficArea
|
||||
{
|
||||
Id = NewAreaId(),
|
||||
AreaName = areaName,
|
||||
SiteList = stationIds,
|
||||
ControllerName = controlRight,
|
||||
IsOccupy = isOccupied,
|
||||
IsEnable = isEnabled
|
||||
});
|
||||
}
|
||||
_status = "已新增区域";
|
||||
}
|
||||
lstTasks.EndUpdate();
|
||||
_allowLoadFromSelection = true;
|
||||
|
||||
SaveToConfig();
|
||||
ClearPanelInputs();
|
||||
_editErr = "";
|
||||
_panel?.Repaint();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_allowLoadFromSelection = true;
|
||||
System.Diagnostics.Debug.WriteLine($"RenderListView failed: {ex}");
|
||||
_editErr = "操作失败:" + ex.Message;
|
||||
_panel?.Repaint();
|
||||
}
|
||||
}
|
||||
|
||||
private void SaveToConfig()
|
||||
{
|
||||
try
|
||||
{
|
||||
string configPath = Path.Combine(Application.StartupPath, "Config", "traffic.json");
|
||||
string dir = Path.GetDirectoryName(configPath);
|
||||
if (!string.IsNullOrEmpty(dir) && !Directory.Exists(dir))
|
||||
Directory.CreateDirectory(dir);
|
||||
File.WriteAllText(configPath, JsonConvert.SerializeObject(TrafficInterlockMission.TrafficAreaList, Formatting.Indented));
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show("保存失败:" + ex.Message);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 点击表格行 → 编辑区展示该行数据
|
||||
|
||||
private void lstTasks_SelectedIndexChanged(object sender, EventArgs e)
|
||||
{
|
||||
if (!_allowLoadFromSelection || lstTasks == null || lstTasks.SelectedIndices.Count == 0) return;
|
||||
int idx = lstTasks.SelectedIndices[0];
|
||||
if (idx < 0 || idx >= TrafficInterlockMission.TrafficAreaList.Count) return;
|
||||
_editingIndex = idx;
|
||||
LoadAreaToPanel(TrafficInterlockMission.TrafficAreaList[idx]);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 编辑区:加载 / 清空
|
||||
|
||||
private void LoadAreaToPanel(TrafficArea a)
|
||||
private static void LoadAreaToFields(TrafficArea a)
|
||||
{
|
||||
if (a == null) return;
|
||||
try
|
||||
{
|
||||
if (lblEditingHint != null)
|
||||
lblEditingHint.Text = $"编辑:{a.AreaName}";
|
||||
if (txtAreaName != null)
|
||||
txtAreaName.Text = a.AreaName ?? "";
|
||||
if (txtStationIds != null)
|
||||
txtStationIds.Text = a.SiteList != null && a.SiteList.Count > 0
|
||||
? string.Join(", ", a.SiteList)
|
||||
: "";
|
||||
if (txtControlRight != null)
|
||||
txtControlRight.Text = a.ControllerName ?? "";
|
||||
if (chkIsOccupied != null)
|
||||
chkIsOccupied.Checked = a.IsOccupy;
|
||||
if (chkIsEnabled != null)
|
||||
chkIsEnabled.Checked = a.IsEnable;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
System.Diagnostics.Debug.WriteLine($"LoadAreaToPanel error: {ex}");
|
||||
}
|
||||
_editingHint = $"编辑:{a.AreaName}";
|
||||
_areaName = a.AreaName ?? "";
|
||||
_stationIds = a.SiteList != null && a.SiteList.Count > 0
|
||||
? string.Join(", ", a.SiteList)
|
||||
: "";
|
||||
_controlRight = a.ControllerName ?? "";
|
||||
_isOccupied = a.IsOccupy;
|
||||
_isEnabled = a.IsEnable;
|
||||
_editErr = "";
|
||||
}
|
||||
|
||||
private void ClearPanelInputs()
|
||||
private static void ClearPanelInputs()
|
||||
{
|
||||
_editingAreaId = "";
|
||||
_editingHint = "新增区域";
|
||||
_areaName = "";
|
||||
_stationIds = "";
|
||||
_controlRight = "";
|
||||
_isOccupied = false;
|
||||
_isEnabled = true;
|
||||
_editErr = "";
|
||||
}
|
||||
|
||||
private static void SaveToConfig()
|
||||
{
|
||||
string json;
|
||||
try
|
||||
{
|
||||
_editingIndex = -1;
|
||||
if (lblEditingHint != null)
|
||||
lblEditingHint.Text = "新增区域";
|
||||
if (txtAreaName != null)
|
||||
txtAreaName.Text = "";
|
||||
if (txtStationIds != null)
|
||||
txtStationIds.Text = "";
|
||||
if (txtControlRight != null)
|
||||
txtControlRight.Text = "";
|
||||
if (chkIsOccupied != null)
|
||||
chkIsOccupied.Checked = false;
|
||||
if (chkIsEnabled != null)
|
||||
chkIsEnabled.Checked = true;
|
||||
lock (TrafficInterlockMission.TrafficAreaList)
|
||||
json = JsonConvert.SerializeObject(TrafficInterlockMission.TrafficAreaList, Formatting.Indented);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
System.Diagnostics.Debug.WriteLine($"ClearPanelInputs error: {ex}");
|
||||
_status = "保存失败:" + ex.Message;
|
||||
_panel?.Repaint();
|
||||
return;
|
||||
}
|
||||
|
||||
var path = JsonPath;
|
||||
var dir = Path.GetDirectoryName(path);
|
||||
Task.Run(() =>
|
||||
{
|
||||
try
|
||||
{
|
||||
if (!string.IsNullOrEmpty(dir) && !Directory.Exists(dir))
|
||||
Directory.CreateDirectory(dir);
|
||||
lock (SaveLock)
|
||||
File.WriteAllText(path, json);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_status = "保存失败:" + ex.Message;
|
||||
_panel?.Repaint();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 解析站点集合字符串 "1,2,3" -> List<int>
|
||||
|
||||
/// <summary>解析站点集合字符串,如 "1,2,3" → <see cref="List{T}"/> of int。</summary>
|
||||
private static List<int> ParseStationIds(string text)
|
||||
{
|
||||
var list = new List<int>();
|
||||
@@ -242,129 +343,19 @@ namespace LoopViewerApp
|
||||
return list;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 按钮:保存 / 刷新 / 新增 / 删除
|
||||
|
||||
private void btnSave_Click(object sender, EventArgs e)
|
||||
private static void EnsureAreaIdsLocked()
|
||||
{
|
||||
try
|
||||
{
|
||||
string areaName = txtAreaName?.Text?.Trim() ?? "";
|
||||
if (string.IsNullOrEmpty(areaName))
|
||||
{
|
||||
MessageBox.Show("请输入区域名称。");
|
||||
return;
|
||||
}
|
||||
|
||||
var stationIds = ParseStationIds(txtStationIds?.Text ?? "");
|
||||
string controlRight = txtControlRight?.Text?.Trim() ?? "";
|
||||
bool isOccupied = chkIsOccupied?.Checked ?? false;
|
||||
bool isEnabled = chkIsEnabled?.Checked ?? true;
|
||||
|
||||
if (_editingIndex >= 0 && _editingIndex < TrafficInterlockMission.TrafficAreaList.Count)
|
||||
{
|
||||
lock (TrafficInterlockMission.TrafficAreaList)
|
||||
{
|
||||
var existing = TrafficInterlockMission.TrafficAreaList[_editingIndex];
|
||||
existing.AreaName = areaName;
|
||||
existing.SiteList = stationIds;
|
||||
existing.ControllerName = controlRight;
|
||||
existing.IsOccupy = isOccupied;
|
||||
existing.IsEnable = isEnabled;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
lock (TrafficInterlockMission.TrafficAreaList)
|
||||
{
|
||||
TrafficInterlockMission.TrafficAreaList.Add(new TrafficArea
|
||||
{
|
||||
AreaName = areaName,
|
||||
SiteList = stationIds,
|
||||
ControllerName = controlRight,
|
||||
IsOccupy = isOccupied,
|
||||
IsEnable = isEnabled
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
SaveToConfig();
|
||||
RenderListView();
|
||||
ClearPanelInputs();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
System.Diagnostics.Debug.WriteLine($"btnSave_Click error: {ex}");
|
||||
MessageBox.Show("操作失败:" + ex.Message);
|
||||
}
|
||||
foreach (var area in TrafficInterlockMission.TrafficAreaList)
|
||||
EnsureAreaId(area);
|
||||
}
|
||||
|
||||
private void btnRefresh_Click(object sender, EventArgs e)
|
||||
private static string EnsureAreaId(TrafficArea area)
|
||||
{
|
||||
try
|
||||
{
|
||||
RenderListView();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
System.Diagnostics.Debug.WriteLine($"btnRefresh_Click error: {ex}");
|
||||
}
|
||||
if (string.IsNullOrWhiteSpace(area.Id))
|
||||
area.Id = NewAreaId();
|
||||
return area.Id;
|
||||
}
|
||||
|
||||
private void btnNew_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (lstTasks != null)
|
||||
lstTasks.SelectedIndices.Clear();
|
||||
ClearPanelInputs();
|
||||
// 进入新增模式:填写下方编辑区后点击“保存”即可新增一条数据
|
||||
}
|
||||
|
||||
private void btnDelete_Click(object sender, EventArgs e)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (lstTasks == null || lstTasks.SelectedIndices.Count == 0)
|
||||
{
|
||||
MessageBox.Show("请先在上方列表中选择要删除的区域。");
|
||||
return;
|
||||
}
|
||||
|
||||
var dialogResult = MessageBox.Show(
|
||||
"确定要删除选中的区域吗?",
|
||||
"确认删除",
|
||||
MessageBoxButtons.YesNo,
|
||||
MessageBoxIcon.Warning);
|
||||
|
||||
if (dialogResult != DialogResult.Yes)
|
||||
return;
|
||||
|
||||
var indices = lstTasks.SelectedIndices.Cast<int>()
|
||||
.OrderByDescending(i => i)
|
||||
.ToList();
|
||||
|
||||
lock (TrafficInterlockMission.TrafficAreaList)
|
||||
{
|
||||
foreach (var idx in indices)
|
||||
{
|
||||
if (idx >= 0 && idx < TrafficInterlockMission.TrafficAreaList.Count)
|
||||
{
|
||||
TrafficInterlockMission.TrafficAreaList.RemoveAt(idx);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SaveToConfig();
|
||||
RenderListView();
|
||||
ClearPanelInputs();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
System.Diagnostics.Debug.WriteLine($"btnDelete_Click error: {ex}");
|
||||
MessageBox.Show("删除失败:" + ex.Message);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
private static string NewAreaId() => Guid.NewGuid().ToString("N");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user