using DevExpress.XtraBars; using DevExpress.XtraEditors; using DevExpress.XtraEditors.Controls; using DevExpress.XtraEditors.Repository; using DevExpress.XtraLayout.Utils; using DevExpress.XtraVerticalGrid.Events; namespace Yw.WinFrmUI { public partial class HydroParterPropertyCtrl : XtraUserControl { public HydroParterPropertyCtrl() { InitializeComponent(); this.layoutControl1.SetupLayoutControl(); SetDescriptionVisible(false);//默认设置属性描述面板不显示 } /// /// 匹配db事件 /// 第一个参数为匹配Db的ViewModel /// 第二个参数为是否匹配成功 /// public event Func MatchingDbEvent; /// /// 设置曲线事件 /// 第一个参数为设置曲线的ViewModel /// 第二个参数为曲线类型 /// 第三个参数为是否设置成功 /// public event Func SetCurveEvent; /// /// 设置模式事件 /// 第一个参数为设置模式事的ViewModel /// 第二个参数为模式事类型 /// 第三个参数为是否设置成功 /// public event Func SetPatternEvent; /// /// 属性值正在改变事件 /// public event Func PropertyValueChangingEvent; /// /// 属性值发生改变事件 /// public event Func PropertyValueChangedEvent; /// /// 强调连接组件事件 /// 第一个参数为本身Code /// 第二个参数为连接Code /// public event Action BlinkLinkParterEvent; //获取水力信息方法 private Func _hydroInfoFunc = null; /// /// 初始化数据 /// public void InitialData(Func hydroInfoFunc) { _hydroInfoFunc = hydroInfoFunc; } /// /// 绑定对象 /// public HydroParterPropertyViewModel SelectedObject { get { return this.propertyGridControl1.SelectedObject as HydroParterPropertyViewModel; } set { this.propertyGridControl1.SelectedObject = value; } } /// /// 重新从数据源中读取数据,外观恢复刚开始加载的样子 /// public void UpdateData() { this.propertyGridControl1.UpdateData(); } /// /// 更新数据,样式不变 /// public void UpdateRows() { this.propertyGridControl1.UpdateRows(); } //获取行的视图对象 private HydroParterPropertyViewModel GetPropertyViewModel(DevExpress.XtraVerticalGrid.Rows.BaseRow row) { if (row.Level <= 1) { return this.SelectedObject; } if (row.ParentRow == null) { return this.SelectedObject; } if (row.ParentRow.Properties.Value is HydroParterPropertyViewModel) { return row.ParentRow.Properties.Value as HydroParterPropertyViewModel; } return GetPropertyViewModel(row.ParentRow); } //设置描述控件的可见性 private void SetDescriptionVisible(bool isVisible) { var visible = isVisible ? LayoutVisibility.Always : LayoutVisibility.Never; 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"); } else { var descriptor = this.propertyGridControl1.GetPropertyDescriptor(e.Row); 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() + " " + displayUnitAttri.Unit; } } } } //自定义属性描述 private void propertyGridControl1_CustomPropertyDescriptors(object sender, CustomPropertyDescriptorsEventArgs e) { } //属性编辑框的显示与取消 private void propertyGridControl1_ShowingEditor(object sender, CancelEventArgs e) { var rowTypeFullName = this.propertyGridControl1.FocusedRow.Properties.RowType.FullName; var fieldName = this.propertyGridControl1.FocusedRow.Properties.FieldName.Split(new char[] { '.' }).Last(); if (rowTypeFullName == typeof(Image).FullName) { e.Cancel = true; return; } var descriptor = this.propertyGridControl1.GetPropertyDescriptor(this.propertyGridControl1.FocusedRow); var showEditor = (ShowEditorAttribute)descriptor.Attributes[typeof(ShowEditorAttribute)]; if (showEditor != null) { if (!showEditor.ShowEditor) { e.Cancel = true; return; } } } //行标题,描述,编辑框 private void propertyGridControl1_CustomRecordCellEdit(object sender, GetCustomRowCellEditEventArgs e) { 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 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) { 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(); // } //} #endregion #region bool if (rowTypeFullName == typeof(bool).FullName) { var ckEdit = new RepositoryItemCheckEdit(); ckEdit.CheckStyle = DevExpress.XtraEditors.Controls.CheckStyles.Standard; if (e.Row.Properties.ReadOnly == true) { ckEdit.ReadOnly = true; } e.RepositoryItem = ckEdit; } #endregion #region 富文本 var attri_multi = (MultiTextAttribute)descriptor.Attributes[typeof(MultiTextAttribute)]; if (attri_multi != null) { var memoEdit = new RepositoryItemMemoEdit(); if (e.Row.Properties.ReadOnly == true) { memoEdit.ReadOnly = true; } e.RepositoryItem = memoEdit; } #endregion #region 图片 if (rowTypeFullName == typeof(Image).FullName) { var picEdit = new RepositoryItemPictureEdit(); picEdit.ReadOnly = true; picEdit.NullText = "空"; e.RepositoryItem = picEdit; e.Row.Expanded = true; } #endregion #region 型号 var modelTypeAttri = (IsHydroModelTypeAttribute)descriptor.Attributes[typeof(IsHydroModelTypeAttribute)]; if (modelTypeAttri != null) { var buttonEdit = new RepositoryItemButtonEdit(); buttonEdit.TextEditStyle = TextEditStyles.DisableTextEditor; buttonEdit.ButtonClick += delegate { if (this.MatchingDbEvent == null) { 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; } #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.Tank: { if (this.SetCurveEvent == null || !this.SetCurveEvent.Invoke(vm, HydroCurve.Pump)) { XtraMessageBox.Show("正在开发中..."); } } break; case HydroCurve.TankVol: { if (this.SetCurveEvent == null || !this.SetCurveEvent.Invoke(vm, HydroCurve.TankVol)) { XtraMessageBox.Show("正在开发中..."); } } break; case HydroCurve.Pump: { if (this.SetCurveEvent == null || !this.SetCurveEvent.Invoke(vm, HydroCurve.Pump)) { //缺省的设置方法 } } 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) => { if (hydroInfo.Curves == null) { hydroInfo.Curves = new List(); } if (curveQh != null) { hydroInfo.Curves.Remove(curveQh); } hydroInfo.Curves.Add(curveInfo); pumpViewModel.CurveQH = curveInfo.Code; UpdateRows(); }; dlg.SetBindingData(hydroInfo, curveQh, curvePropAttri.CurveType); dlg.ShowDialog(); } } break; case HydroCurve.PumpQP: { if (this.SetCurveEvent == null || !this.SetCurveEvent.Invoke(vm, curvePropAttri.CurveType)) { var pumpViewModel = vm as HydroPumpPropertyViewModel; var curveQp = hydroInfo.Curves?.Find(x => x.Code == pumpViewModel.CurveQP); var dlg = new SetHydroCurveDlg(); dlg.ReloadDataEvent += (curveInfo) => { if (hydroInfo.Curves == null) { hydroInfo.Curves = new List(); } if (curveQp != null) { hydroInfo.Curves.Remove(curveQp); } hydroInfo.Curves.Add(curveInfo); pumpViewModel.CurveQP = curveInfo.Code; UpdateRows(); }; dlg.SetBindingData(hydroInfo, curveQp, curvePropAttri.CurveType); dlg.ShowDialog(); } } 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) => { if (hydroInfo.Curves == null) { hydroInfo.Curves = new List(); } 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: { if (this.SetCurveEvent == null || !this.SetCurveEvent.Invoke(vm, curvePropAttri.CurveType)) { //缺省的设置方法 } } break; default: break; } }; e.RepositoryItem = buttonEdit; } #endregion #region 模式 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); 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; } #endregion #region 标签 var flagsPro = (IsHydroFlagsProAttribute)descriptor.Attributes[typeof(IsHydroFlagsProAttribute)]; if (flagsPro != null && flagsPro.FlagsPro) { var buttonEdit = new RepositoryItemButtonEdit(); buttonEdit.TextEditStyle = TextEditStyles.DisableTextEditor; buttonEdit.ButtonClick += async delegate { var vm = GetPropertyViewModel(e.Row); var flagVmoList = await BLLFactory.Instance.GetBySysType(Yw.Hydro.DataType.HydroParter); var dbFlagList = flagVmoList?.Select(x => x.Name).Distinct().ToList(); var dlg = new SetFlagsDlg(); dlg.SetBindingData(dbFlagList, Yw.Untity.FlagsHelper.ToList(vm.Flags)); dlg.ReloadDataEvent += (flags) => { vm.Flags = Yw.Untity.FlagsHelper.ToString(flags); UpdateRows(); }; dlg.ShowDialog(); }; 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 } //属性值正在改变 void propertyGridControl1_CellValueChanging(object sender, DevExpress.XtraVerticalGrid.Events.CellValueChangedEventArgs e) { var fieldName = e.Row.Properties.FieldName.Split(new char[] { '.' }).Last(); var descriptor = this.propertyGridControl1.GetPropertyDescriptor(e.Row); var propertyViewModel = GetPropertyViewModel(e.Row); this.PropertyValueChangingEvent?.Invoke(propertyViewModel); } //属性值改变 void propertyGridControl1_CellValueChanged(object sender, DevExpress.XtraVerticalGrid.Events.CellValueChangedEventArgs e) { var fieldName = e.Row.Properties.FieldName.Split(new char[] { '.' }).Last(); var descriptor = this.propertyGridControl1.GetPropertyDescriptor(e.Row); var propertyViewModel = GetPropertyViewModel(e.Row); this.PropertyValueChangedEvent?.Invoke(propertyViewModel); if (this.PropertyValueChangedEvent == null || !this.PropertyValueChangedEvent.Invoke(propertyViewModel)) { var hydroInfo = _hydroInfoFunc?.Invoke(); if (hydroInfo == null) { return; } var allParterList = hydroInfo.GetAllParters(); var parter = allParterList?.Find(x => x.ID == propertyViewModel.ID); if (parter == null) { return; } parter.UpdateProperty(allParterList, propertyViewModel); } UpdateRows(); } // 描述 private void barBtnHelp_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { var visible = this.splitterItem1.Visibility == LayoutVisibility.Always ? false : true; SetDescriptionVisible(visible); } //全部展开 private void barBtnExpandAll_ItemClick(object sender, ItemClickEventArgs e) { this.propertyGridControl1.ExpandAllRows(); } //全部折叠 private void barBtnCollpseAll_ItemClick(object sender, ItemClickEventArgs e) { this.propertyGridControl1.CollapseAllRows(); } //聚焦行改变 private void propertyGridControl1_FocusedRowChanged(object sender, FocusedRowChangedEventArgs e) { } private void propertyGridControl1_CustomDrawCaption(object sender, CustomDrawCaptionEventArgs e) { } } }