duheng
2024-10-24 5fcc843704ca90c742b578aa5898acf0097f753b
WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-property/HydroParterPropertyCtrl.cs
@@ -1,14 +1,9 @@
using DevExpress.Data.ExpressionEditor;
using DevExpress.Utils;
using DevExpress.XtraBars;
using DevExpress.XtraBars;
using DevExpress.XtraEditors;
using DevExpress.XtraEditors.Controls;
using DevExpress.XtraEditors.Repository;
using DevExpress.XtraLayout.Utils;
using DevExpress.XtraVerticalGrid.Events;
using NetTaste;
using System.Windows.Forms.VisualStyles;
using Yw.EPAnet;
namespace Yw.WinFrmUI
{
@@ -23,17 +18,25 @@
        }
        /// <summary>
        /// 获取水力信息事件
        /// 匹配db事件
        /// 第一个参数为匹配Db的ViewModel
        /// 第二个参数为是否匹配成功
        /// </summary>
        public event Func<Yw.Model.HydroModelInfo> GetHydroInfoEvent;
        public event Func<HydroParterPropertyViewModel, bool> MatchingDbEvent;
        /// <summary>
        /// 选择曲线事件
        /// 设置曲线事件
        /// 第一个参数为设置曲线的ViewModel
        /// 第二个参数为曲线类型
        /// 第三个参数为是否设置成功
        /// </summary>
        public event Func<HydroParterPropertyViewModel, string, bool> SelectCurveEvent;
        public event Func<HydroParterPropertyViewModel, string, bool> SetCurveEvent;
        /// <summary>
        /// 选择模式事件
        /// 设置模式事件
        /// 第一个参数为设置模式事的ViewModel
        /// 第二个参数为模式事类型
        /// 第三个参数为是否设置成功
        /// </summary>
        public event Func<HydroParterPropertyViewModel, string, bool> SelectPatternEvent;
        public event Func<HydroParterPropertyViewModel, string, bool> SetPatternEvent;
        /// <summary>
        /// 属性值正在改变事件
        /// </summary>
@@ -42,6 +45,24 @@
        /// 属性值发生改变事件
        /// </summary>
        public event Func<HydroParterPropertyViewModel, bool> PropertyValueChangedEvent;
        /// <summary>
        /// 强调连接组件事件
        /// 第一个参数为本身Code
        /// 第二个参数为连接Code
        /// </summary>
        public event Action<string, string> BlinkLinkParterEvent;
        //获取水力信息方法
        private Func<Yw.Model.HydroModelInfo> _hydroInfoFunc = null;
        /// <summary>
        /// 初始化数据
        /// </summary>
        public void InitialData(Func<Yw.Model.HydroModelInfo> hydroInfoFunc)
        {
            _hydroInfoFunc = hydroInfoFunc;
        }
        /// <summary>
        /// 绑定对象
@@ -55,7 +76,6 @@
            set
            {
                this.propertyGridControl1.SelectedObject = value;
                OnChanged();
            }
        }
@@ -68,15 +88,7 @@
            set
            {
                this.propertyGridControl1.SelectedObjects = value?.ToArray();
                OnChanged();
            }
        }
        //改变触发
        protected virtual void OnChanged()
        {
        }
        /// <summary>
@@ -98,7 +110,11 @@
        //获取行的视图对象
        private HydroParterPropertyViewModel GetPropertyViewModel(DevExpress.XtraVerticalGrid.Rows.BaseRow row)
        {
            if (row.Level == 1)
            if (row.Level <= 1)
            {
                return this.SelectedObject;
            }
            if (row.ParentRow == null)
            {
                return this.SelectedObject;
            }
@@ -116,10 +132,66 @@
            this.layoutDescription.Visibility = this.splitterItem1.Visibility = visible;
        }
        //自定义属性值显示内容
        //自定义属性Header显示
        private void propertyGridControl1_CustomDrawRowHeaderCell(object sender, CustomDrawRowHeaderCellEventArgs e)
        {
            //行字段名称
            //var rowFieldName = this.propertyGridControl1.FocusedRow.Properties.FieldName.Split(new char[] { '.' }).Last();
            //if (string.IsNullOrEmpty(rowFieldName))
            //{
            //    e.Handled = false;
            //    return;
            //}
            //if (e.Row is not DevExpress.XtraVerticalGrid.Rows.BaseRow)
            //{
            //    e.Handled = false;
            //    return;
            //}
            //var vm = GetPropertyViewModel(e.Row);
            //var propStatus = vm.GetPropStatus(rowFieldName);
            //if (propStatus == null)
            //{
            //    e.Handled = false;
            //    return;
            //}
            //switch (propStatus.PropStatus)
            //{
            //    case Yw.Hydro.ePropStatus.Error:
            //        {
            //            e.Row.AppearanceHeader.ForeColor = Color.White;
            //            e.Row.AppearanceHeader.BackColor = Color.Red;
            //        }
            //        break;
            //    case Yw.Hydro.ePropStatus.Normal:
            //        {
            //            e.Row.AppearanceHeader.ForeColor = Color.Black;
            //            e.Row.AppearanceHeader.BackColor = Color.White;
            //        }
            //        break;
            //    case Yw.Hydro.ePropStatus.Lack:
            //        {
            //            e.Row.AppearanceHeader.ForeColor = Color.White;
            //            e.Row.AppearanceHeader.BackColor = Color.Green;
            //        }
            //        break;
            //    case Yw.Hydro.ePropStatus.Abnormal:
            //        {
            //            e.Row.AppearanceHeader.ForeColor = Color.White;
            //            e.Row.AppearanceHeader.BackColor = Color.Orange;
            //        }
            //        break;
            //    default: break;
            //}
            //e.Handled = true;
        }
        //自定义属性值显示
        private void propertyGridControl1_CustomDrawRowValueCell(object sender, CustomDrawRowValueCellEventArgs e)
        {
            //行类型全名称
            var rowTypeFullName = e.Row.Properties.RowType.FullName;
            //行字段名称
            var rowFieldName = e.Row.Properties.FieldName.Split(new char[] { '.' }).Last();
            if (rowTypeFullName == typeof(DateTime).FullName)
            {
                e.CellText = ((DateTime)e.Properties.Value).ToString("yyyy-MM-dd HH:mm:ss");
@@ -127,12 +199,21 @@
            else
            {
                var descriptor = this.propertyGridControl1.GetPropertyDescriptor(e.Row);
                var displayUnit = (DisplayUnitAttribute)descriptor.Attributes[typeof(DisplayUnitAttribute)];
                if (displayUnit != null)
                var calcuPropAttri = (IsHydroCalcuProAttribute)descriptor.Attributes[typeof(IsHydroCalcuProAttribute)];
                if (calcuPropAttri != null && calcuPropAttri.CalcuPro)
                {
                    if (e.Properties.Value == null)
                    {
                        e.CellText = "尚未计算";
                        e.Appearance.ForeColor = Color.OrangeRed;
                    }
                }
                var displayUnitAttri = (DisplayUnitAttribute)descriptor.Attributes[typeof(DisplayUnitAttribute)];
                if (displayUnitAttri != null)
                {
                    if (e.Properties.Value != null)
                    {
                        e.CellText = e.Properties.Value.ToString() + " " + displayUnit.Unit;
                        e.CellText = e.Properties.Value.ToString() + " " + displayUnitAttri.Unit;
                    }
                }
            }
@@ -174,40 +255,55 @@
            var fieldName = e.Row.Properties.FieldName.Split(new char[] { '.' }).Last();
            var descriptor = this.propertyGridControl1.GetPropertyDescriptor(e.Row);
            var rowTypeFullName = e.Row.Properties.RowType.FullName;
            var vm = GetPropertyViewModel(e.Row);
            #region 属性显示名称和描述
            //名称
            var attri_caption = (DisplayNameAttribute)descriptor.Attributes[typeof(DisplayNameAttribute)];
            if (attri_caption != null && !string.IsNullOrEmpty(attri_caption.DisplayName))
            //var displayNameAttri = (DisplayNameAttribute)descriptor.Attributes[typeof(DisplayNameAttribute)];
            //if (displayNameAttri != null && !string.IsNullOrEmpty(displayNameAttri.DisplayName))
            //{
            //    e.Row.Properties.Caption = displayNameAttri.DisplayName;
            //}
            var propStatus = vm.GetPropStatus(fieldName);
            if (propStatus != null)
            {
                e.Row.Properties.Caption = attri_caption.DisplayName;
                var sb = new StringBuilder();
                sb.AppendLine($"状态:{propStatus.PropStatus.GetDisplayText()}");
                sb.AppendLine($"信息:{propStatus.StatusInfo}");
                e.Row.Properties.ToolTip = sb.ToString();
            }
            //备注
            if (e.Row.Properties.Value == null)
            {
                e.Row.Properties.ToolTip = string.Empty;
            }
            else
            {
                if (e.Row.Properties.RowType.IsEnum)
                {
                    e.Row.Properties.ToolTip = ((Enum)(e.Row.Properties.Value)).GetDisplayText();
                }
                else if (e.Row.Properties.RowType.FullName == typeof(DateTime).FullName)
                {
                    e.Row.Properties.ToolTip = ((DateTime)e.Row.Properties.Value).ToString("yyyy-MM-dd HH:mm:ss");
                }
                else if (e.Row.Properties.RowType.FullName == typeof(Image).FullName)
                {
                    e.Row.Properties.ToolTip = string.Empty;
                }
                else
                {
                    e.Row.Properties.ToolTip = e.Row.Properties.Value.ToString();
                }
            }
            //if (e.Row.Properties.Value == null)
            //{
            //    e.Row.Properties.ToolTip = string.Empty;
            //}
            //else
            //{
            //    if (e.Row.Properties.RowType.IsEnum)
            //    {
            //        e.Row.Properties.ToolTip = ((Enum)(e.Row.Properties.Value)).GetDisplayText();
            //    }
            //    else if (e.Row.Properties.RowType.FullName == typeof(DateTime).FullName)
            //    {
            //        e.Row.Properties.ToolTip = ((DateTime)e.Row.Properties.Value).ToString("yyyy-MM-dd HH:mm:ss");
            //    }
            //    else if (e.Row.Properties.RowType.FullName == typeof(Image).FullName)
            //    {
            //        e.Row.Properties.ToolTip = string.Empty;
            //    }
            //    else
            //    {
            //        e.Row.Properties.ToolTip = e.Row.Properties.Value.ToString();
            //    }
            //}
            #endregion
@@ -254,34 +350,71 @@
            #endregion
            #region 曲线
            #region 型号
            var curvePro = (IsHydroCurveProAttribute)descriptor.Attributes[typeof(IsHydroCurveProAttribute)];
            if (curvePro != null)
            var modelTypeAttri = (IsHydroModelTypeAttribute)descriptor.Attributes[typeof(IsHydroModelTypeAttribute)];
            if (modelTypeAttri != null)
            {
                var buttonEdit = new RepositoryItemButtonEdit();
                buttonEdit.TextEditStyle = TextEditStyles.DisableTextEditor;
                buttonEdit.ButtonClick += delegate
                {
                    var vm = GetPropertyViewModel(e.Row);
                    if (this.SelectCurveEvent == null || !this.SelectCurveEvent.Invoke(vm, curvePro.CurveType))
                    if (this.MatchingDbEvent == null)
                    {
                        var hydroInfo = GetHydroInfoEvent?.Invoke();
                        if (hydroInfo == null)
                        {
                            return;
                        }
                        switch (curvePro.CurveType)
                        {
                            case HydroCurve.Pump:
                                {
                        return;
                    }
                    var hydroInfo = _hydroInfoFunc?.Invoke();
                    if (hydroInfo == null)
                    {
                        return;
                    }
                    var vm = GetPropertyViewModel(e.Row);
                    if (vm == null)
                    {
                        return;
                    }
                    var bol = this.MatchingDbEvent.Invoke(vm);
                    if (bol)
                    {
                        UpdateRows();
                    }
                };
                e.RepositoryItem = buttonEdit;
            }
                                }
                                break;
                            case HydroCurve.PumpQH:
            #endregion
            #region 曲线
            var curvePropAttri = (IsHydroCurveProAttribute)descriptor.Attributes[typeof(IsHydroCurveProAttribute)];
            if (curvePropAttri != null)
            {
                var buttonEdit = new RepositoryItemButtonEdit();
                buttonEdit.TextEditStyle = TextEditStyles.DisableTextEditor;
                buttonEdit.ButtonClick += delegate
                {
                    var hydroInfo = _hydroInfoFunc?.Invoke();
                    if (hydroInfo == null)
                    {
                        return;
                    }
                    var vm = GetPropertyViewModel(e.Row);
                    switch (curvePropAttri.CurveType)
                    {
                        case HydroCurve.Pump:
                            {
                                if (this.SetCurveEvent == null || !this.SetCurveEvent.Invoke(vm, HydroCurve.Pump))
                                {
                                    var vmPump = vm as HydroPumpPropertyViewModel;
                                    var curveQh = hydroInfo.Curves?.Find(x => x.Code == vmPump.CurveQH);
                                    //缺省的设置方法
                                }
                            }
                            break;
                        case HydroCurve.PumpQH:
                            {
                                if (this.SetCurveEvent == null || !this.SetCurveEvent.Invoke(vm, HydroCurve.PumpQH))
                                {
                                    var pumpViewModel = vm as HydroPumpPropertyViewModel;
                                    var curveQh = hydroInfo.Curves?.Find(x => x.Code == pumpViewModel.CurveQH);
                                    var dlg = new SetHydroCurveDlg();
                                    dlg.ReloadDataEvent += (curveInfo) =>
                                    {
@@ -294,17 +427,20 @@
                                            hydroInfo.Curves.Remove(curveQh);
                                        }
                                        hydroInfo.Curves.Add(curveInfo);
                                        vmPump.CurveQH = curveInfo.Code;
                                        pumpViewModel.CurveQH = curveInfo.Code;
                                        UpdateRows();
                                    };
                                    dlg.SetBindingData(hydroInfo, curveQh, curvePro.CurveType);
                                    dlg.SetBindingData(hydroInfo, curveQh, curvePropAttri.CurveType);
                                    dlg.ShowDialog();
                                }
                                break;
                            case HydroCurve.PumpQP:
                            }
                            break;
                        case HydroCurve.PumpQP:
                            {
                                if (this.SetCurveEvent == null || !this.SetCurveEvent.Invoke(vm, curvePropAttri.CurveType))
                                {
                                    var vmPump = vm as HydroPumpPropertyViewModel;
                                    var curveQp = hydroInfo.Curves?.Find(x => x.Code == vmPump.CurveQP);
                                    var pumpViewModel = vm as HydroPumpPropertyViewModel;
                                    var curveQp = hydroInfo.Curves?.Find(x => x.Code == pumpViewModel.CurveQP);
                                    var dlg = new SetHydroCurveDlg();
                                    dlg.ReloadDataEvent += (curveInfo) =>
                                    {
@@ -317,48 +453,54 @@
                                            hydroInfo.Curves.Remove(curveQp);
                                        }
                                        hydroInfo.Curves.Add(curveInfo);
                                        vmPump.CurveQP = curveInfo.Code;
                                        pumpViewModel.CurveQP = curveInfo.Code;
                                        UpdateRows();
                                    };
                                    dlg.SetBindingData(hydroInfo, curveQp, curvePro.CurveType);
                                    dlg.SetBindingData(hydroInfo, curveQp, curvePropAttri.CurveType);
                                    dlg.ShowDialog();
                                }
                                break;
                            case HydroCurve.PumpQE:
                            }
                            break;
                        case HydroCurve.PumpQE:
                            {
                                var pumpViewModel = vm as HydroPumpPropertyViewModel;
                                var curveQe = hydroInfo.Curves?.Find(x => x.Code == pumpViewModel.CurveQE);
                                var dlg = new SetHydroCurveDlg();
                                dlg.ReloadDataEvent += (curveInfo) =>
                                {
                                    var vmPump = vm as HydroPumpPropertyViewModel;
                                    var curveQe = hydroInfo.Curves?.Find(x => x.Code == vmPump.CurveQE);
                                    var dlg = new SetHydroCurveDlg();
                                    dlg.ReloadDataEvent += (curveInfo) =>
                                    if (hydroInfo.Curves == null)
                                    {
                                        if (hydroInfo.Curves == null)
                                        {
                                            hydroInfo.Curves = new List<Model.HydroCurveInfo>();
                                        }
                                        if (curveQe != null)
                                        {
                                            hydroInfo.Curves.Remove(curveQe);
                                        }
                                        hydroInfo.Curves.Add(curveInfo);
                                        vmPump.CurveQE = curveInfo.Code;
                                        UpdateRows();
                                    };
                                    dlg.SetBindingData(hydroInfo, curveQe, curvePro.CurveType);
                                    dlg.ShowDialog();
                                }
                                break;
                            case HydroCurve.Valve:
                                        hydroInfo.Curves = new List<Model.HydroCurveInfo>();
                                    }
                                    if (curveQe != null)
                                    {
                                        hydroInfo.Curves.Remove(curveQe);
                                    }
                                    hydroInfo.Curves.Add(curveInfo);
                                    pumpViewModel.CurveQE = curveInfo.Code;
                                    UpdateRows();
                                };
                                dlg.SetBindingData(hydroInfo, curveQe, curvePropAttri.CurveType);
                                dlg.ShowDialog();
                            }
                            break;
                        case HydroCurve.Valve:
                            {
                                if (this.SetCurveEvent == null || !this.SetCurveEvent.Invoke(vm, HydroCurve.Valve))
                                {
                                    //缺省的设置方法
                                }
                                break;
                            case HydroCurve.ValveQL:
                            }
                            break;
                        case HydroCurve.ValveQL:
                            {
                                if (this.SetCurveEvent == null || !this.SetCurveEvent.Invoke(vm, curvePropAttri.CurveType))
                                {
                                    //缺省的设置方法
                                }
                                break;
                            default: break;
                        }
                            }
                            break;
                        default: break;
                    }
                };
                e.RepositoryItem = buttonEdit;
@@ -368,15 +510,38 @@
            #region 模式
            var patternPro = (IsHydroPatternProAttribute)descriptor.Attributes[typeof(IsHydroPatternProAttribute)];
            if (patternPro != null)
            var patternProAttri = (IsHydroPatternProAttribute)descriptor.Attributes[typeof(IsHydroPatternProAttribute)];
            if (patternProAttri != null)
            {
                var buttonEdit = new RepositoryItemButtonEdit();
                buttonEdit.TextEditStyle = TextEditStyles.DisableTextEditor;
                buttonEdit.ButtonClick += delegate
                {
                    var hydroInfo = _hydroInfoFunc?.Invoke();
                    if (hydroInfo == null)
                    {
                        return;
                    }
                    var vm = GetPropertyViewModel(e.Row);
                    this.SelectPatternEvent?.Invoke(vm, patternPro.PatternType);
                    switch (patternProAttri.PatternType)
                    {
                        case HydroPattern.Head:
                            {
                                if (this.SetPatternEvent == null || !this.SetPatternEvent.Invoke(vm, HydroPattern.Head))
                                {
                                    //缺省的设置方法
                                }
                            }
                            break;
                        case HydroPattern.Demand:
                            {
                                if (this.SetPatternEvent == null || !this.SetPatternEvent.Invoke(vm, HydroPattern.Demand))
                                {
                                    //缺省的设置方法
                                }
                            }
                            break;
                    }
                };
                e.RepositoryItem = buttonEdit;
            }
@@ -386,7 +551,7 @@
            #region 标签
            var flagsPro = (IsHydroFlagsProAttribute)descriptor.Attributes[typeof(IsHydroFlagsProAttribute)];
            if (flagsPro != null)
            if (flagsPro != null && flagsPro.FlagsPro)
            {
                var buttonEdit = new RepositoryItemButtonEdit();
                buttonEdit.TextEditStyle = TextEditStyles.DisableTextEditor;
@@ -406,6 +571,32 @@
                };
                e.RepositoryItem = buttonEdit;
            }
            #endregion
            #region 连接
            if (e.Row.Properties.Value != null)
            {
                var linkCodeAttri = (IsHydroLinkCodeAttribute)descriptor.Attributes[typeof(IsHydroLinkCodeAttribute)];
                if (linkCodeAttri != null)
                {
                    var buttonEdit = new RepositoryItemButtonEdit();
                    buttonEdit.TextEditStyle = TextEditStyles.DisableTextEditor;
                    buttonEdit.ButtonClick += delegate
                    {
                        var hydroInfo = _hydroInfoFunc?.Invoke();
                        if (hydroInfo == null)
                        {
                            return;
                        }
                        var vm = GetPropertyViewModel(e.Row);
                        this.BlinkLinkParterEvent?.Invoke(vm.Code, e.Row.Properties.Value.ToString());
                    };
                    e.RepositoryItem = buttonEdit;
                }
            }
            #endregion
@@ -429,7 +620,7 @@
            this.PropertyValueChangedEvent?.Invoke(propertyViewModel);
            if (this.PropertyValueChangedEvent == null || !this.PropertyValueChangedEvent.Invoke(propertyViewModel))
            {
                var hydroInfo = GetHydroInfoEvent?.Invoke();
                var hydroInfo = _hydroInfoFunc?.Invoke();
                if (hydroInfo == null)
                {
                    return;
@@ -464,11 +655,17 @@
            this.propertyGridControl1.CollapseAllRows();
        }
        //聚焦行改变
        private void propertyGridControl1_FocusedRowChanged(object sender, FocusedRowChangedEventArgs e)
        {
        }
        private void propertyGridControl1_CustomDrawCaption(object sender, CustomDrawCaptionEventArgs e)
        {
        }
    }
}