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 HydroVisualPropertyViewCtrl : XtraUserControl
{
public HydroVisualPropertyViewCtrl()
{
InitializeComponent();
this.layoutControl1.SetupLayoutControl();
}
///
/// 强调连接节点事件
/// 第一个参数为本身Code
/// 第二个参数为连接节点Code
///
public event Action BlinkLinkNodeEvent;
///
/// 查看构件事件
///
public event Action HydroViewEvent;
///
/// 绑定对象
///
public HydroVisualViewModel SelectedObject
{
get
{
var vm = this.propertyGridControl1.SelectedObject as HydroVisualViewModel;
return vm;
}
set
{
this.barBtnView.Visibility = value == null ? BarItemVisibility.Never : BarItemVisibility.Always;
this.propertyGridControl1.SelectedObject = value;
}
}
///
/// 重新从数据源中读取数据,外观恢复刚开始加载的样子
///
public void UpdateData()
{
this.propertyGridControl1.UpdateData();
}
///
/// 更新数据,样式不变
///
public void UpdateRows()
{
this.propertyGridControl1.UpdateRows();
}
//获取行的视图对象
private HydroVisualViewModel GetPropertyViewModel(DevExpress.XtraVerticalGrid.Rows.BaseRow row)
{
if (row == null)
{
return default;
}
if (row.Level <= 1)
{
return this.SelectedObject;
}
if (row.ParentRow == null)
{
return this.SelectedObject;
}
if (row.ParentRow.Properties.Value is HydroVisualViewModel)
{
return row.ParentRow.Properties.Value as HydroVisualViewModel;
}
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_CustomDrawRowHeaderIndent(object sender, CustomDrawRowHeaderIndentEventArgs e)
{
}
//自定义属性Header显示
private void propertyGridControl1_CustomDrawRowHeaderCell(object sender, CustomDrawRowHeaderCellEventArgs e)
{
//字段名称
var fieldName = e.Row.Properties.FieldName.Split(new char[] { '.' }).Last();
if (string.IsNullOrEmpty(fieldName))
{
return;
}
//属性描述器
var descriptor = this.propertyGridControl1.GetPropertyDescriptor(e.Row);
if (descriptor != null)
{
//名称
var displayNameAttri = (DisplayNameAttribute)descriptor.Attributes[typeof(DisplayNameAttribute)];
if (displayNameAttri != null && !string.IsNullOrEmpty(displayNameAttri.DisplayName))
{
e.Caption = displayNameAttri.DisplayName;
}
}
//颜色
var vm = GetPropertyViewModel(e.Row);
if (vm != null)
{
var propStatus = vm.GetPropStatus(fieldName);
if (propStatus != null)
{
switch (propStatus.PropStatus)
{
case Yw.Hydro.ePropStatus.Error:
{
e.Appearance.ForeColor = Color.Red;
}
break;
case Yw.Hydro.ePropStatus.Normal:
{
e.Appearance.ForeColor = Color.Black;
}
break;
case Yw.Hydro.ePropStatus.Lack:
{
e.Appearance.ForeColor = Color.Green;
}
break;
case Yw.Hydro.ePropStatus.Abnormal:
{
e.Appearance.ForeColor = Color.Orange;
}
break;
default: break;
}
}
}
}
//自定义属性值显示
private void propertyGridControl1_CustomDrawRowValueCell(object sender, CustomDrawRowValueCellEventArgs e)
{
//行字段名称
var fieldName = e.Row.Properties.FieldName.Split(new char[] { '.' }).Last();
if (string.IsNullOrEmpty(fieldName))
{
return;
}
//行类型全名称
var fullTypeName = e.Row.Properties.RowType.FullName;
if (fullTypeName == typeof(DateTime).FullName)
{
e.CellText = ((DateTime)e.Properties.Value).ToString("yyyy-MM-dd HH:mm:ss");
}
else
{
var descriptor = this.propertyGridControl1.GetPropertyDescriptor(e.Row);
if (descriptor != null)
{
var calcuPropAttri = (HydroCalcuProAttribute)descriptor.Attributes[typeof(HydroCalcuProAttribute)];
if (calcuPropAttri != null)
{
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_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 showEditorInView = (ShowEditorInViewAttribute)descriptor.Attributes[typeof(ShowEditorInViewAttribute)];
if (showEditorInView == null)
{
e.Cancel = true;
return;
}
if (!showEditorInView.ShowEditor)
{
e.Cancel = true;
return;
}
}
//编辑框
private void propertyGridControl1_CustomRecordCellEdit(object sender, GetCustomRowCellEditEventArgs e)
{
var fieldName = e.Row.Properties.FieldName.Split(new char[] { '.' }).Last();
if (string.IsNullOrEmpty(fieldName))
{
return;
}
var descriptor = this.propertyGridControl1.GetPropertyDescriptor(e.Row);
var rowTypeFullName = e.Row.Properties.RowType.FullName;
var vm = GetPropertyViewModel(e.Row);
if (vm == null)
{
return;
}
#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 curvePropAttri = (HydroCurveProAttribute)descriptor.Attributes[typeof(HydroCurveProAttribute)];
if (curvePropAttri != null)
{
var buttonEdit = new RepositoryItemButtonEdit();
buttonEdit.TextEditStyle = TextEditStyles.DisableTextEditor;
buttonEdit.ButtonClick += delegate
{
var vm = GetPropertyViewModel(e.Row);
if (vm == null)
{
return;
}
switch (curvePropAttri.CurveType)
{
case HydroCurve.Tank:
{
}
break;
case HydroCurve.TankVol:
{
}
break;
case HydroCurve.Pump:
{
}
break;
case HydroCurve.PumpQH:
{
}
break;
case HydroCurve.PumpQP:
{
//var pumpViewModel = vm as HydroPumpViewModel;
//var curveQp = vm.HydroInfo.Curves?.Find(x => x.Code == pumpViewModel.CurveQP);
//var dlg = new SetHydroCurveDlg();
//dlg.ReloadDataEvent += (curveInfo) =>
//{
// if (vm.HydroInfo.Curves == null)
// {
// vm.HydroInfo.Curves = new List();
// }
// if (curveQp != null)
// {
// vm.HydroInfo.Curves.Remove(curveQp);
// }
// vm.HydroInfo.Curves.Add(curveInfo);
// pumpViewModel.CurveQP = curveInfo.Code;
// UpdateRows();
//};
//dlg.SetBindingData(vm.HydroInfo, curveQp, curvePropAttri.CurveType);
//dlg.ShowDialog();
}
break;
case HydroCurve.PumpQE:
{
//var pumpViewModel = vm as HydroPumpViewModel;
//var curveQe = vm.HydroInfo.Curves?.Find(x => x.Code == pumpViewModel.CurveQE);
//var dlg = new SetHydroCurveDlg();
//dlg.ReloadDataEvent += (curveInfo) =>
//{
// if (vm.HydroInfo.Curves == null)
// {
// vm.HydroInfo.Curves = new List();
// }
// if (curveQe != null)
// {
// vm.HydroInfo.Curves.Remove(curveQe);
// }
// vm.HydroInfo.Curves.Add(curveInfo);
// pumpViewModel.CurveQE = curveInfo.Code;
// UpdateRows();
//};
//dlg.SetBindingData(vm.HydroInfo, curveQe, curvePropAttri.CurveType);
//dlg.ShowDialog();
}
break;
case HydroCurve.Valve:
{
}
break;
case HydroCurve.ValveQL:
{
}
break;
default: break;
}
};
e.RepositoryItem = buttonEdit;
}
#endregion
#region 模式
var patternProAttri = (HydroPatternProAttribute)descriptor.Attributes[typeof(HydroPatternProAttribute)];
if (patternProAttri != null)
{
var buttonEdit = new RepositoryItemButtonEdit();
buttonEdit.TextEditStyle = TextEditStyles.DisableTextEditor;
buttonEdit.ButtonClick += delegate
{
var vm = GetPropertyViewModel(e.Row);
switch (patternProAttri.PatternType)
{
case HydroPattern.Head:
{
}
break;
case HydroPattern.Demand:
{
}
break;
}
};
e.RepositoryItem = buttonEdit;
}
#endregion
#region 连接
if (e.Row.Properties.Value != null)
{
var linkCodeAttri = (HydroLinkProAttribute)descriptor.Attributes[typeof(HydroLinkProAttribute)];
if (linkCodeAttri != null)
{
var buttonEdit = new RepositoryItemButtonEdit();
buttonEdit.TextEditStyle = TextEditStyles.DisableTextEditor;
buttonEdit.ButtonClick += delegate
{
var vm = GetPropertyViewModel(e.Row);
var vmLink = vm as HydroLinkViewModel;
this.BlinkLinkNodeEvent?.Invoke(vmLink, e.Row.Properties.Value.ToString());
};
e.RepositoryItem = buttonEdit;
}
}
#endregion
#region 阀门
if (vm is HydroValveViewModel valve)
{
if (fieldName == nameof(HydroValveViewModel.ValveSetting))
{
e.Row.Visible = false;
}
switch (valve.Vmo.ValveType)
{
case Yw.Hydro.ValveType.PSV:
{
if (fieldName == nameof(HydroValveViewModel.ValvePress))
{
e.Row.Visible = true;
}
if (fieldName == nameof(HydroValveViewModel.ValveFlow))
{
e.Row.Visible = false;
}
if (fieldName == nameof(HydroValveViewModel.ValveOL))
{
e.Row.Visible = false;
}
if (fieldName == nameof(HydroValveViewModel.ValveQL))
{
e.Row.Visible = false;
}
}
break;
case Yw.Hydro.ValveType.PRV:
{
if (fieldName == nameof(HydroValveViewModel.ValvePress))
{
e.Row.Visible = true;
}
if (fieldName == nameof(HydroValveViewModel.ValveFlow))
{
e.Row.Visible = false;
}
if (fieldName == nameof(HydroValveViewModel.ValveOL))
{
e.Row.Visible = false;
}
if (fieldName == nameof(HydroValveViewModel.ValveQL))
{
e.Row.Visible = false;
}
}
break;
case Yw.Hydro.ValveType.PBV:
{
if (fieldName == nameof(HydroValveViewModel.ValvePress))
{
e.Row.Visible = true;
}
if (fieldName == nameof(HydroValveViewModel.ValveFlow))
{
e.Row.Visible = false;
}
if (fieldName == nameof(HydroValveViewModel.ValveOL))
{
e.Row.Visible = false;
}
if (fieldName == nameof(HydroValveViewModel.ValveQL))
{
e.Row.Visible = false;
}
}
break;
case Yw.Hydro.ValveType.FCV:
{
if (fieldName == nameof(HydroValveViewModel.ValvePress))
{
e.Row.Visible = false;
}
if (fieldName == nameof(HydroValveViewModel.ValveFlow))
{
e.Row.Visible = true;
}
if (fieldName == nameof(HydroValveViewModel.ValveOL))
{
e.Row.Visible = false;
}
if (fieldName == nameof(HydroValveViewModel.ValveQL))
{
e.Row.Visible = false;
}
}
break;
case Yw.Hydro.ValveType.TCV:
{
if (fieldName == nameof(HydroValveViewModel.ValvePress))
{
e.Row.Visible = false;
}
if (fieldName == nameof(HydroValveViewModel.ValveFlow))
{
e.Row.Visible = false;
}
if (fieldName == nameof(HydroValveViewModel.ValveOL))
{
e.Row.Visible = true;
}
if (fieldName == nameof(HydroValveViewModel.ValveQL))
{
e.Row.Visible = false;
}
}
break;
case Yw.Hydro.ValveType.GPV:
{
if (fieldName == nameof(HydroValveViewModel.ValvePress))
{
e.Row.Visible = false;
}
if (fieldName == nameof(HydroValveViewModel.ValveFlow))
{
e.Row.Visible = false;
}
if (fieldName == nameof(HydroValveViewModel.ValveOL))
{
e.Row.Visible = false;
}
if (fieldName == nameof(HydroValveViewModel.ValveQL))
{
e.Row.Visible = true;
}
}
break;
case Yw.Hydro.ValveType.CV:
{
if (fieldName == nameof(HydroValveViewModel.ValvePress))
{
e.Row.Visible = false;
}
if (fieldName == nameof(HydroValveViewModel.ValveFlow))
{
e.Row.Visible = false;
}
if (fieldName == nameof(HydroValveViewModel.ValveOL))
{
e.Row.Visible = false;
}
if (fieldName == nameof(HydroValveViewModel.ValveQL))
{
e.Row.Visible = false;
}
}
break;
default: break;
}
}
#endregion
}
//属性值改变
private void propertyGridControl1_CellValueChanged(object sender, DevExpress.XtraVerticalGrid.Events.CellValueChangedEventArgs e)
{
//var fieldName = e.Row.Properties.FieldName.Split(new char[] { '.' }).Last();
//if (string.IsNullOrEmpty(fieldName))
//{
// return;
//}
//var vm = GetPropertyViewModel(e.Row);
//if (vm == null)
//{
// return;
//}
//vm.UpdateVmoProperty();
}
//全部展开
private void barBtnExpandAll_ItemClick(object sender, ItemClickEventArgs e)
{
this.propertyGridControl1.ExpandAllRows();
}
//全部折叠
private void barBtnCollpseAll_ItemClick(object sender, ItemClickEventArgs e)
{
this.propertyGridControl1.CollapseAllRows();
}
//查看
private void barBtnView_ItemClick(object sender, ItemClickEventArgs e)
{
var vm = this.SelectedObject;
if (vm == null)
{
return;
}
this.HydroViewEvent?.Invoke(vm);
}
// 描述
private void barBtnHelp_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
{
var visible = this.splitterItem1.Visibility == LayoutVisibility.Always ? false : true;
SetDescriptionVisible(visible);
}
//聚焦行改变
private void propertyGridControl1_FocusedRowChanged(object sender, FocusedRowChangedEventArgs e)
{
if (e.Row == null)
{
return;
}
//字段名称
var fieldName = e.Row.Properties.FieldName.Split(new char[] { '.' }).Last();
if (string.IsNullOrEmpty(fieldName))
{
return;
}
var vm = GetPropertyViewModel(e.Row);
if (vm == null)
{
return;
}
string caption = string.Empty;
string descrition = string.Empty;
//属性描述器
var descriptor = this.propertyGridControl1.GetPropertyDescriptor(e.Row);
if (descriptor != null)
{
//名称
var displayNameAttri = (DisplayNameAttribute)descriptor.Attributes[typeof(DisplayNameAttribute)];
if (displayNameAttri != null && !string.IsNullOrEmpty(displayNameAttri.DisplayName))
{
caption = displayNameAttri.DisplayName;
}
//描述
var descritionAttri = (DescriptionAttribute)descriptor.Attributes[typeof(DescriptionAttribute)];
if (descritionAttri != null)
{
descrition = descritionAttri.Description;
}
}
var propStatus = vm.GetPropStatus(fieldName);
this.hydroVisualPropertyDescriptionCtrl1.SetBindingData(caption, descrition, propStatus);
}
}
}