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)
{
}
}
}