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);//默认设置属性描述面板不显示
|
}
|
|
/// <summary>
|
/// 匹配db事件
|
/// 第一个参数为匹配Db的ViewModel
|
/// 第二个参数为是否匹配成功
|
/// </summary>
|
public event Func<HydroParterPropertyViewModel, bool> MatchingDbEvent;
|
/// <summary>
|
/// 设置曲线事件
|
/// 第一个参数为设置曲线的ViewModel
|
/// 第二个参数为曲线类型
|
/// 第三个参数为是否设置成功
|
/// </summary>
|
public event Func<HydroParterPropertyViewModel, string, bool> SetCurveEvent;
|
/// <summary>
|
/// 设置模式事件
|
/// 第一个参数为设置模式事的ViewModel
|
/// 第二个参数为模式事类型
|
/// 第三个参数为是否设置成功
|
/// </summary>
|
public event Func<HydroParterPropertyViewModel, string, bool> SetPatternEvent;
|
/// <summary>
|
/// 属性值正在改变事件
|
/// </summary>
|
public event Func<HydroParterPropertyViewModel, bool> PropertyValueChangingEvent;
|
/// <summary>
|
/// 属性值发生改变事件
|
/// </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>
|
/// 绑定对象
|
/// </summary>
|
public HydroParterPropertyViewModel SelectedObject
|
{
|
get
|
{
|
return this.propertyGridControl1.SelectedObject as HydroParterPropertyViewModel;
|
}
|
set
|
{
|
this.propertyGridControl1.SelectedObject = value;
|
}
|
}
|
|
/// <summary>
|
/// 绑定对象列表
|
/// </summary>
|
public List<HydroParterPropertyViewModel> SelectedObjects
|
{
|
get { return this.propertyGridControl1.SelectedObjects?.Select(x => x as HydroParterPropertyViewModel).ToList(); }
|
set
|
{
|
this.propertyGridControl1.SelectedObjects = value?.ToArray();
|
}
|
}
|
|
/// <summary>
|
/// 重新从数据源中读取数据,外观恢复刚开始加载的样子
|
/// </summary>
|
public void UpdateData()
|
{
|
this.propertyGridControl1.UpdateData();
|
}
|
|
/// <summary>
|
/// 更新数据,样式不变
|
/// </summary>
|
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.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<Model.HydroCurveInfo>();
|
}
|
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<Model.HydroCurveInfo>();
|
}
|
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<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:
|
{
|
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<Yw.BLL.SysFlag>.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)
|
{
|
|
}
|
|
|
}
|
}
|