using System;
|
using System.Collections.Generic;
|
using System.ComponentModel;
|
using System.Drawing;
|
using System.Data;
|
using System.Linq;
|
using System.Text;
|
using System.Windows.Forms;
|
using DevExpress.XtraEditors;
|
using DevExpress.XtraLayout.Utils;
|
using DevExpress.Utils;
|
using DevExpress.XtraTreeList.Nodes;
|
|
namespace DPumpHydr.WinFrmUI.Volute
|
{
|
public partial class StepTreeListCtrl : XtraUserControl
|
{
|
public StepTreeListCtrl()
|
{
|
InitializeComponent();
|
this.layoutControl1.AllowCustomization = false;//AllowCustomizationMenu
|
this.layoutControl1.OptionsView.UseParentAutoScaleFactor = true;
|
RegistEvents();
|
}
|
|
/// <summary>
|
/// 步骤节点选择改变后事件
|
/// </summary>
|
public event Action<TreeStepNode,TreeStepNode> AfterStepNodeSelectedChangedEvent;
|
|
/// <summary>
|
/// 步骤节点选择改变前触发事件
|
/// </summary>
|
public event Func<TreeStepNode,TreeStepNode,bool> BeforeStepNodeSelectedChangedEvent;
|
|
/// <summary>
|
/// 选中的节点
|
/// </summary>
|
public TreeStepNode SelectedStepNode
|
{
|
get { return _selStepNode; }
|
private set
|
{
|
var selStepNode = _selStepNode;
|
_selStepNode = value;
|
if (selStepNode == null)
|
{
|
if (_selStepNode != null)
|
{
|
if (this.AfterStepNodeSelectedChangedEvent != null)
|
this.AfterStepNodeSelectedChangedEvent(selStepNode, _selStepNode);
|
}
|
}
|
else if ( !System.Object.ReferenceEquals(selStepNode, _selStepNode))
|
{
|
if (this.AfterStepNodeSelectedChangedEvent != null)
|
this.AfterStepNodeSelectedChangedEvent(selStepNode, _selStepNode);
|
}
|
this.treeList1.Refresh();
|
}
|
}
|
private TreeStepNode _selStepNode = null;
|
|
public List<TreeStepNode> GetStepSource()
|
{
|
return this.treeList1.DataSource as List<TreeStepNode>;
|
}
|
|
/// <summary>
|
/// 设置步骤数据源
|
/// </summary>
|
/// <param name="value"></param>
|
public void SetStepSource(List<TreeStepNode> value)
|
{
|
this.treeList1.DataSource = value;
|
this.treeList1.RefreshDataSource();
|
if (value == null || value.Count < 1)
|
{
|
_selStepNode = null;
|
}
|
else
|
{
|
this.treeList1.ExpandAll();
|
if (!value.Contains(_selStepNode))
|
{
|
var firstStepNode = value.Find(x => x.AllowSelect);
|
var focusedNode = this.treeList1.FindNodeByKeyID(firstStepNode.ID);
|
this.treeList1.FocusedNode = focusedNode;
|
this.SelectedStepNode = firstStepNode;
|
}
|
}
|
}
|
|
/// <summary>
|
/// 设置步骤数据源
|
/// </summary>
|
/// <param name="list"></param>
|
/// <param name="selStepNode"></param>
|
public void SetStepSource(List<TreeStepNode> list,int ID)
|
{
|
this.treeList1.DataSource = list;
|
this.treeList1.RefreshDataSource();
|
if (list == null || list.Count < 1)
|
{
|
_selStepNode = null;
|
}
|
else
|
{
|
this.treeList1.ExpandAll();
|
var selStepNode = list.Find(x => x.ID == ID && x.AllowSelect);
|
if (selStepNode == null)
|
{
|
if(!list.Contains(_selStepNode))
|
selStepNode = list.Find(x => x.AllowSelect);
|
}
|
if (selStepNode != null)
|
{
|
var focusedNode = this.treeList1.FindNodeByKeyID(selStepNode.ID);
|
this.treeList1.FocusedNode = focusedNode;
|
this.SelectedStepNode = selStepNode;
|
}
|
}
|
}
|
public void ResetStepSource(List<TreeStepNode> list)
|
{
|
this.treeList1.DataSource = list;
|
this.treeList1.RefreshDataSource();
|
}
|
|
|
|
|
#region 私有方法
|
|
//注册事件
|
private void RegistEvents()
|
{
|
this.treeList1.GetSelectImage += (sender, e) =>
|
{
|
var ID = Convert.ToInt64(e.Node.GetValue("ID"));
|
var stepNode = GetStepSource().Find(x => x.ID == ID);
|
if (stepNode == null)
|
return;
|
switch (stepNode.DataState)
|
{
|
case TreeStepNode.eDataState.错误: e.NodeImageIndex = 0; break;
|
case TreeStepNode.eDataState.正确: e.NodeImageIndex = 1; break;
|
case TreeStepNode.eDataState.未知: e.NodeImageIndex = -1; break;
|
default: break;
|
}
|
};
|
|
this.treeList1.GetStateImage += (sender, e) =>
|
{
|
var ID = Convert.ToInt64(e.Node.GetValue("ID"));
|
var stepNode = GetStepSource().Find(x => x.ID == ID);
|
if (stepNode == null)
|
return;
|
switch (stepNode.ProgressState)
|
{
|
case TreeStepNode.eProgressState.未完成: e.NodeImageIndex = 0; break;
|
case TreeStepNode.eProgressState.正在进行: e.NodeImageIndex = 1; break;
|
case TreeStepNode.eProgressState.已完成: e.NodeImageIndex = 2; break;
|
default: break;
|
}
|
};
|
|
this.treeList1.BeforeFocusNode += (sender, e) =>
|
{
|
var nextStepID = Convert.ToInt64(e.Node.GetValue("ID"));
|
var nextStepNode = GetStepSource().Find(x => x.ID == nextStepID);
|
if (!nextStepNode.AllowSelect)
|
{
|
e.CanFocus = false;
|
return;
|
}
|
if (_selStepNode != null)
|
{
|
if (_selStepNode.ID == nextStepNode.ID)
|
return;
|
}
|
if (this.BeforeStepNodeSelectedChangedEvent != null)
|
{
|
TreeStepNode beforeStepNode = null;
|
if (e.OldNode != null)
|
{
|
var beforeStepID = Convert.ToInt64(e.OldNode.GetValue("ID"));
|
beforeStepNode = GetStepSource().Find(x => x.ID == beforeStepID);
|
}
|
if (!this.BeforeStepNodeSelectedChangedEvent(beforeStepNode, nextStepNode))
|
{
|
e.CanFocus = false;
|
return;
|
}
|
}
|
};
|
|
this.treeList1.AfterFocusNode += (sender, e) =>
|
{
|
var ID = Convert.ToInt64(e.Node.GetValue("ID"));
|
var nodeModel = GetStepSource().Find(x => x.ID == ID);
|
this.SelectedStepNode = nodeModel;
|
};
|
|
this.treeList1.AfterExpand += (sender, e) =>
|
{
|
if (_selStepNode != null)
|
{
|
var node = this.treeList1.FindNodeByKeyID(_selStepNode.ID);
|
if (e.Node.Nodes.Contains(node))
|
this.treeList1.FocusedNode = node;
|
}
|
};
|
}
|
|
#endregion
|
|
|
#region 公有方法
|
|
/// <summary>
|
/// 根据步骤ID聚焦节点
|
/// </summary>
|
/// <param name="StepNodeID"></param>
|
public void SetFocusedNode(long StepNodeID)
|
{
|
var treeNode = this.treeList1.FindNodeByKeyID(StepNodeID);
|
if (treeNode != null)
|
this.treeList1.FocusedNode = treeNode;
|
}
|
|
/// <summary>
|
/// 上一步
|
/// </summary>
|
public void GoPrev()
|
{
|
if (_selStepNode == null)
|
return;
|
var allCanSelStepNodes = GetStepSource().Where(x => x.AllowSelect).ToList();
|
var index = allCanSelStepNodes.IndexOf(_selStepNode);
|
if (index <= 0)
|
return;
|
var prevStepNode = allCanSelStepNodes[index - 1];
|
var prevNode = this.treeList1.FindNodeByKeyID(prevStepNode.ID);
|
this.treeList1.FocusedNode = prevNode;
|
}
|
|
/// <summary>
|
/// 下一步
|
/// </summary>
|
public void GoNext()
|
{
|
if (_selStepNode == null)
|
return;
|
var allCanSelStepNodes = GetStepSource().Where(x => x.AllowSelect).ToList();
|
var index = allCanSelStepNodes.IndexOf(_selStepNode);
|
|
if (index == allCanSelStepNodes.Count - 1)
|
{
|
return;
|
}
|
var nextStepNode = allCanSelStepNodes[index + 1];
|
var nextNode = this.treeList1.FindNodeByKeyID(nextStepNode.ID);
|
this.treeList1.FocusedNode = nextNode;
|
}
|
|
#endregion
|
|
|
}
|
|
}
|