using DevExpress.XtraEditors; using Gs.DevApp.ToolBox; using Newtonsoft.Json; using System; using System.Windows.Forms; namespace Gs.DevApp.DevFrm.Sys { /// /// 看板节点编辑窗体 /// public partial class SimpleKanBanEdit : DevExpress.XtraEditors.XtraForm { private string _webServiceName = "MesSimpleManager/"; private string _strId = ""; // 当前编辑的节点ID(为空表示新增) private string _strFid = ""; // 父节点ID private int _nodeLevel = 0; // 节点层级 private bool _isEditMode = false; // 是否为编辑模式 private bool _isLoading = false; // 是否正在加载数据 /// /// 保存成功后的回调事件 /// public event EventHandler UpdateParent; /// /// 构造函数 /// /// 节点ID,为空表示新增 /// 父节点ID,为空表示根节点 public SimpleKanBanEdit(string strId, string strFid) { InitializeComponent(); rgNodeType.EditValueChanged += RgNodeType_EditValueChanged; _strId = strId; _strFid = strFid; _isEditMode = !string.IsNullOrEmpty(_strId); // 设置窗体标题 this.Text = _isEditMode ? "编辑看板节点" : "新增看板节点"; // 初始化节点类型选项(0=根目录, 1=看板目录, 2=看板内容) rgNodeType.Properties.Items.Clear(); rgNodeType.Properties.Items.Add(new DevExpress.XtraEditors.Controls.RadioGroupItem(0, "根目录")); rgNodeType.Properties.Items.Add(new DevExpress.XtraEditors.Controls.RadioGroupItem(1, "看板目录")); rgNodeType.Properties.Items.Add(new DevExpress.XtraEditors.Controls.RadioGroupItem(2, "看板内容")); // 保存按钮 btnSave.Click += BtnSave_Click; // 取消按钮 btnCancel.Click += (s, e) => { this.Close(); }; // 初始化默认值 seSortOrder.Value = 0; seCarouselDuration.Value = 10; chkIsExpanded.Checked = false; chkIsEnabled.Checked = true; // 加载数据 if (_isEditMode) { LoadModel(); } else { // 新增模式:根据父节点计算当前节点层级并设置节点类型 InitNodeLevelAndType(); } } /// /// 新增模式:初始化节点层级 /// 规则: /// - node_level = 0:根节点 /// - node_level >= 1:非根节点 /// private void InitNodeLevelAndType() { if (string.IsNullOrEmpty(_strFid)) { // 无父节点,说明是根节点 _nodeLevel = 0; } else { // 有父节点,基于父节点层级 +1 try { var _obj = new { Id = long.Parse(_strFid) }; var json = JsonConvert.SerializeObject(_obj); var strReturn = UtilityHelper.HttpPost("", _webServiceName + "GetModel", json); var dd = UtilityHelper.ReturnToDynamic(strReturn); if (dd.rtnCode > 0 && dd.rtnData != null) { int parentNodeLevel = dd.rtnData.nodeLevel != null ? Convert.ToInt32(dd.rtnData.nodeLevel) : 0; _nodeLevel = parentNodeLevel + 1; } else { _nodeLevel = 1; } } catch { _nodeLevel = 1; } } // 根据层级初始化 NodeType & 控件状态 SetNodeTypeByLevel(); } /// /// 根据节点层级设置节点类型 /// - node_level = 0:只能选 0(根目录),整个控件禁用 /// - node_level >= 1:只能选 1 / 2,根目录项灰掉不可选 /// private void SetNodeTypeByLevel() { // 先统一启用控件,后面按情况处理 rgNodeType.Enabled = true; if (_nodeLevel == 0) { // 根节点:只能是根目录 rgNodeType.EditValue = 0; rgNodeType.Enabled = false; } else { // 非根节点:不能选“根目录(0)” DisableRootNodeTypeItem(); // 如果当前值是 0,强制切到默认值 if (rgNodeType.EditValue == null || Convert.ToInt32(rgNodeType.EditValue) == 0) { rgNodeType.EditValue = 1; // 默认“看板目录” } } SetControlsByNodeType(); } /// /// 禁用 NodeType=0(根目录)选项 /// private void DisableRootNodeTypeItem() { foreach (DevExpress.XtraEditors.Controls.RadioGroupItem item in rgNodeType.Properties.Items) { if (Convert.ToInt32(item.Value) == 0) { item.Enabled = false; break; } } } private void LoadModel() { try { var _obj = new { Id = long.Parse(_strId) }; var json = JsonConvert.SerializeObject(_obj); var strReturn = UtilityHelper.HttpPost("", _webServiceName + "GetModel", json); var dd = UtilityHelper.ReturnToDynamic(strReturn); if (dd.rtnCode > 0 && dd.rtnData != null) { var m = dd.rtnData; // 1. 基础赋值 txtCode.Text = m.code != null ? m.code.ToString() : ""; txtTitle.Text = m.title != null ? m.title.ToString() : ""; txtUrl.Text = m.url != null ? m.url.ToString() : ""; _isLoading = true; _nodeLevel = m.nodeLevel != null ? Convert.ToInt32(m.nodeLevel) : 0; if (m.parentId != null) _strFid = m.parentId.ToString(); if (m.nodeType != null) { int type = Convert.ToInt32(m.nodeType); rgNodeType.EditValue = type; // 获取子节点数量 (从存储过程新增的字段) int childCount = m.childCount != null ? Convert.ToInt32(m.childCount) : 0; // 逻辑判断 if (type == 0) { // 根目录:永远不可修改 rgNodeType.Properties.ReadOnly = true; } else { if (childCount > 0) { rgNodeType.Properties.ReadOnly = true; // 可以给用户一个提示(Tooltip)或在保存时体现,这里仅控制UI只读 } else { rgNodeType.Properties.ReadOnly = false; } } } SetControlsByNodeType(); // 刷新界面 _isLoading = false; // 其他字段 if (m.carouselDuration != null) seCarouselDuration.Value = Convert.ToInt32(m.carouselDuration); if (m.sortOrder != null) seSortOrder.Value = Convert.ToInt32(m.sortOrder); chkIsExpanded.Checked = m.isExpanded != null && Convert.ToBoolean(m.isExpanded); chkIsEnabled.Checked = m.isEnabled != null && Convert.ToBoolean(m.isEnabled); } else { MsgHelper.ShowError("加载数据失败:" + dd.rtnMsg); } } catch (Exception ex) { MsgHelper.ShowError("加载数据异常:" + ex.Message); } } /// /// 根据节点层级(node_level)设置 URL 和轮播时长显示状态 /// private void SetControlsByNodeType() { int nodeType = Convert.ToInt32(rgNodeType.EditValue); // 只有 nodeType == 2(看板内容)才显示 bool show = (nodeType == 2); SetUrlAndDurationVisible(show); } /// /// 类型更改自动刷新 /// private void RgNodeType_EditValueChanged(object sender, EventArgs e) { SetControlsByNodeType(); } /// /// 设置 URL 和轮播时长的显示状态 /// private void SetUrlAndDurationVisible(bool visible) { // 控制可见性 layoutControlItem4.Visibility = visible ? DevExpress.XtraLayout.Utils.LayoutVisibility.Always : DevExpress.XtraLayout.Utils.LayoutVisibility.Never; layoutControlItem5.Visibility = visible ? DevExpress.XtraLayout.Utils.LayoutVisibility.Always : DevExpress.XtraLayout.Utils.LayoutVisibility.Never; // 控制可编辑状态 txtUrl.Enabled = visible; seCarouselDuration.Enabled = visible; if (!visible) { // 不可见时清空 txtUrl.Text = string.Empty; seCarouselDuration.Value = 0; } else { // 可见时给默认值 if (seCarouselDuration.Value <= 0) { seCarouselDuration.Value = 5; // 默认 5 秒 } } } /// /// 保存按钮点击事件 /// private void BtnSave_Click(object sender, EventArgs e) { // 验证必填项 if (string.IsNullOrWhiteSpace(txtTitle.Text)) { MsgHelper.Warning("名称不能为空!"); txtTitle.Focus(); return; } // 节点类型为看板内容时,URL不能为空 if ((int)rgNodeType.EditValue == 2 && string.IsNullOrWhiteSpace(txtUrl.Text)) { MsgHelper.Warning("看板内容的URL地址不能为空!"); txtUrl.Focus(); return; } try { // 构建保存对象 var _obj = new { Id = string.IsNullOrEmpty(_strId) ? 0 : long.Parse(_strId), ParentId = string.IsNullOrEmpty(_strFid) ? (long?)null : long.Parse(_strFid), NodeType = (int)rgNodeType.EditValue, Code = string.IsNullOrWhiteSpace(txtCode.Text) ? null : txtCode.Text.Trim(), Title = txtTitle.Text.Trim(), Url = string.IsNullOrWhiteSpace(txtUrl.Text) ? null : txtUrl.Text.Trim(), CarouselDuration = (int)rgNodeType.EditValue == 2 ? (int?)seCarouselDuration.Value : null, IsExpanded = chkIsExpanded.Checked, IsEnabled = chkIsEnabled.Checked, SortOrder = (int)seSortOrder.Value }; var json = JsonConvert.SerializeObject(_obj); var strReturn = UtilityHelper.HttpPost("", _webServiceName + "SaveModel", json); var dd = UtilityHelper.ReturnToDynamic(strReturn); if (dd.rtnCode > 0) { MsgHelper.ShowInformation("保存成功!"); // 触发父窗体刷新事件 UpdateParent?.Invoke(this, new UpdateParentEventArgs()); this.Close(); } else { MsgHelper.ShowError("保存失败:" + dd.rtnMsg); } } catch (Exception ex) { MsgHelper.ShowError("保存异常:" + ex.Message); } } } }