• DevExpress.XtraTreeList.TreeList 之 XtraTreeHelper


    DevExpress.XtraTreeList.TreeList 完整辅助类之 XtraTreeHelper.cs
     
     
    代码如下:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using DevExpress.XtraTreeList;
    using DevExpress.XtraTreeList.Nodes;
    using System.Windows.Forms;
    using DevExpress.XtraTreeList.Columns;
    using System.Collections;
    using DevExpress.Utils;
    using DevExpress.XtraTreeList.ViewInfo;
    namespace Tools.WinForm.ClientUtility.Helpers
    {
    /// <summary>
    /// XtraTree辅助类
    /// </summary>
    public class XtraTreeHelper
    {
    #region [BindXtraTree]
    /// <summary>
    /// 绑定树
    /// </summary>
    /// <typeparam name="T">数据列表</typeparam>
    /// <param name="tree">树控件</param>
    /// <param name="datas">数据</param>
    /// <param name="selectData">选中数据</param>
    /// <param name="expandLevel">展开层级,0折叠,1展开全部,2展开到第二级,3展开到第三级…</param>
    public static void BindXtraTree<T>(TreeList tree, List<T> datas, T selectData, int expandLevel) where T : IXtraTreeData
    {
    if (tree != null && datas != null)
    {
    tree.BeginUpdate();
    List<T> roots = GetRootDatas(datas);
    AppendNodes(tree, roots, expandLevel, null);
    SelectNode(tree, selectData);
    tree.Tag = datas;
    tree.EndUpdate();
    }
    }
    /// <summary>
    /// 添加节点
    /// </summary>
    static void AppendNodes<T>(TreeList tree, List<T> childs, int expandLevel, TreeListNode pNode) where T : IXtraTreeData
    {
    if (tree != null && childs != null && childs.Count > 0)
    {
    Cursor currentCursor = Cursor.Current;
    Cursor.Current = Cursors.WaitCursor;
    tree.BeginUnboundLoad();
    TreeListNode node;
    foreach (T child in childs)
    {
    List<object> colDatas = new List<object>();
    foreach (TreeListColumn col in tree.Columns)
    {
    if (!string.IsNullOrEmpty(col.FieldName))
    {
    object fieldValue = child.GetPropertyValue(col.FieldName);
    colDatas.Add(fieldValue);
    }
    }
    node = tree.AppendNode(colDatas.ToArray(), pNode, child);
    if (child.Children != null && child.Children.Count > 0)
    {
    AppendNodes(tree, child.Children, expandLevel, node);
    }
    node.Expanded = (expandLevel == 1) || (expandLevel > child.NodeLevel);
    }
    tree.EndUnboundLoad();
    Cursor.Current = currentCursor;
    }
    }
    static List<T> GetRootDatas<T>(List<T> dataList) where T : IXtraTreeData
    {
    if (dataList != null || dataList.Count > 1)
    {
    Dictionary<string, T> dataDic = new Dictionary<string, T>();
    foreach (T data in dataList)
    {
    dataDic[data.NodeID] = data;
    data.Children.Clear();
    data.Parent = null;
    }
    foreach (T node in dataList)
    {
    if (dataDic.ContainsKey(node.NodeParentID))
    {
    dataDic[node.NodeParentID].Children.Add(node);
    node.Parent = dataDic[node.NodeParentID];
    }
    }
    List<T> roots = dataList.FindAll(data => { return data.Parent == null; });
    foreach (T root in roots)
    {
    SetNodeLevel(root, 1);
    }
    return roots;
    }
    return dataList;
    }
    static void SetNodeLevel<T>(T data, int level) where T : IXtraTreeData
    {
    data.NodeLevel = level;
    level++;
    if (data.Children != null && data.Children.Count > 0)
    {
    foreach (T child in data.Children)
    {
    SetNodeLevel(child, level);
    }
    }
    }
    #endregion
    #region [SelectNode]
    /// <summary>
    /// 选中节点数据
    /// </summary>
    /// <typeparam name="T">节点类型</typeparam>
    /// <param name="tree">树控件</param>
    /// <param name="data">选中数据</param>
    public static void SelectNode<T>(TreeList tree, T data) where T : IXtraTreeData
    {
    if (data != null && !string.IsNullOrEmpty(data.NodeID))
    {
    SelectNode(tree, data.NodeID);
    }
    }
    /// <summary>
    /// 选中节点ID
    /// </summary>
    /// <param name="tree">树控件</param>
    /// <param name="selectID">选中数据ID</param>
    public static void SelectNode(TreeList tree, string selectID)
    {
    if (tree != null && tree.Nodes != null && tree.Nodes.Count > 0 && !string.IsNullOrEmpty(selectID))
    {
    tree.BeginUpdate();
    SelectNodeNest(tree.Nodes, selectID, false);
    tree.EndUpdate();
    }
    }
    private static void SelectNodeNest(TreeListNodes nodes, string selectID, bool finded)
    {
    foreach (TreeListNode node in nodes)
    {
    IXtraTreeData data = node.Tag as IXtraTreeData;
    if (data != null)
    {
    if (data.NodeID == selectID)
    {
    node.Selected = true;
    finded = true;
    }
    }
    else
    {
    throw new InvalidOperationException("只有通过XtraTreeHelper绑定的树才能调用此方法选中节点");
    }
    if (finded)
    {
    break;
    }
    else if (node.Nodes != null && node.Nodes.Count > 0)
    {
    SelectNodeNest(node.Nodes, selectID, finded);
    }
    }
    }
    #endregion
    #region [FindNode]
    /// <summary>
    /// 选中节点数据
    /// </summary>
    /// <typeparam name="T">节点类型</typeparam>
    /// <param name="tree">树控件</param>
    /// <param name="data">选中数据</param>
    public static TreeListNode FindNode<T>(TreeList tree, T data) where T : IXtraTreeData
    {
    return FindNode(tree, data.NodeID);
    }
    /// <summary>
    /// 选中节点ID
    /// </summary>
    /// <param name="tree">树控件</param>
    /// <param name="nodeID">选中数据ID</param>
    public static TreeListNode FindNode(TreeList tree, string nodeID)
    {
    if (tree != null && tree.Nodes != null && tree.Nodes.Count > 0 && !string.IsNullOrEmpty(nodeID))
    {
    tree.BeginUpdate();
    TreeListNode findNode = FindNodeNest(tree.Nodes, nodeID);
    tree.EndUpdate();
    return findNode;
    }
    return null;
    }
    private static TreeListNode FindNodeNest(TreeListNodes nodes, string nodeID)
    {
    foreach (TreeListNode node in nodes)
    {
    IXtraTreeData data = node.Tag as IXtraTreeData;
    if (data != null)
    {
    if (data.NodeID.Equals(nodeID))
    {
    return node;
    }
    else if (node.Nodes != null && node.Nodes.Count > 0)
    {
    TreeListNode findNode = FindNodeNest(node.Nodes, nodeID);
    if (findNode != null) { return findNode; }
    }
    }
    else
    {
    throw new InvalidOperationException("只有通过XtraTreeHelper绑定的树才能调用此方法选中节点");
    }
    }
    return null;
    }
    #endregion
    #region [ExpandLevel]
    /// <summary>
    /// 展开树
    /// </summary>
    /// <typeparam name="T">数据列表</typeparam>
    /// <param name="tree">树控件</param>
    /// <param name="expandLevel">展开层级,0折叠,1展开全部,2展开到第二级,3展开到第三级…</param>
    public static void ExpandTree<T>(TreeList tree, int expandLevel) where T : IXtraTreeData
    {
    if (tree == null) { throw new ArgumentException("TreeList为空"); }
    tree.SuspendLayout();
    tree.BeginUpdate();
    if (expandLevel <= 0) { tree.CollapseAll(); }
    else if (expandLevel == 1) { tree.ExpandAll(); }
    else
    {
    ExpandTreeNest(tree.Nodes, expandLevel);
    }
    tree.EndUpdate();
    tree.ResumeLayout(true);
    }
    /// <summary>
    /// 遍历递归展开
    /// </summary>
    /// <param name="nodes">节点集合</param>
    /// <param name="expandLevel">展开层级</param>
    private static void ExpandTreeNest(TreeListNodes nodes, int expandLevel)
    {
    if (nodes != null && nodes.Count > 0)
    {
    foreach (TreeListNode node in nodes)
    {
    IXtraTreeData data = node.Tag as IXtraTreeData;
    if (data != null && data.NodeLevel < expandLevel)
    {
    node.Expanded = true;
    if (node.Nodes != null && node.Nodes.Count > 0 && data.NodeLevel < expandLevel - 1)
    {
    ExpandTreeNest(node.Nodes, expandLevel);
    }
    else if (node.Nodes != null && node.Nodes.Count > 0)
    {
    foreach (TreeListNode cNode in node.Nodes)
    {
    cNode.Expanded = false;
    }
    }
    }
    }
    }
    }
    #endregion
    #region [AppendNode]



    /// <summary>
    /// 添加节点数据
    /// </summary>
    /// <typeparam name="T">节点类型</typeparam>
    /// <param name="tree">树控件</param>
    /// <param name="data">数据</param>
    /// <param name="afterWho">在哪个节点后</param>
    /// <param name="select">是否选中添加数据</param>
    public static TreeListNode AppendNode<T>(TreeList tree, T data, string afterWho, bool select) where T : IXtraTreeData
    {
    if (tree == null) { throw new ArgumentException("TreeList为空"); }
    tree.BeginUpdate();
    TreeListNode appendNode = null;
    TreeListNode parentNode = null;
    if (!string.IsNullOrEmpty(data.NodeParentID))
    {
    parentNode = FindNode(tree, data.NodeParentID);
    }
    List<object> colDatas = new List<object>();
    foreach (TreeListColumn col in tree.Columns)
    {
    if (!string.IsNullOrEmpty(col.FieldName))
    {
    object fieldValue = data.GetPropertyValue(col.FieldName);
    colDatas.Add(fieldValue);
    }
    }
    if (parentNode != null)
    {
    T pData = (T)parentNode.Tag;
    if (pData != null)
    {
    pData.Children.Add(data);
    data.Parent = pData;
    }
    }
    else
    {
    List<T> dataSource = tree.Tag as List<T>;
    if (dataSource != null)
    {
    dataSource.Add(data);
    }
    }
    appendNode = tree.AppendNode(colDatas.ToArray(), parentNode, data);
    if (!string.IsNullOrEmpty(afterWho))
    {
    TreeListNode afterWhoNode = FindNode(tree, afterWho);
    if (afterWhoNode != null && object.ReferenceEquals(afterWhoNode.ParentNode, parentNode))
    {
    // 增加顶级节点处理
    TreeListNodes nodes = afterWhoNode.ParentNode == null ? tree.Nodes : parentNode.Nodes;
    int afterWhoIndex = nodes.IndexOf(afterWhoNode);
    tree.SetNodeIndex(appendNode, afterWhoIndex + 1);
    }
    }
    if (select)
    {
    appendNode.Selected = true;
    }
    tree.Refresh();
    tree.EndUpdate();
    return appendNode;
    }
    #endregion
    #region [InsertNode]



    /// <summary>
    /// 插入节点数据
    /// </summary>
    /// <typeparam name="T">节点类型</typeparam>
    /// <param name="tree">树控件</param>
    /// <param name="data">数据</param>
    /// <param name="beforWho">在哪个节点前</param>
    /// <param name="select">是否选中添加数据</param>
    public static TreeListNode InsertNode<T>(TreeList tree, T data, string beforWho, bool select) where T : IXtraTreeData
    {
    if (tree == null) { throw new ArgumentException("TreeList为空"); }
    tree.BeginUpdate();
    TreeListNode appendNode = null;
    TreeListNode parentNode = null;
    if (!string.IsNullOrEmpty(data.NodeParentID))
    {
    parentNode = FindNode(tree, data.NodeParentID);
    }
    List<object> colDatas = new List<object>();
    foreach (TreeListColumn col in tree.Columns)
    {
    if (!string.IsNullOrEmpty(col.FieldName))
    {
    object fieldValue = data.GetPropertyValue(col.FieldName);
    colDatas.Add(fieldValue);
    }
    }
    if (parentNode != null)
    {
    T pData = (T)parentNode.Tag;
    if (pData != null)
    {
    pData.Children.Add(data);
    data.Parent = pData;
    }
    }
    else
    {
    List<T> dataSource = tree.Tag as List<T>;
    if (dataSource != null)
    {
    dataSource.Add(data);
    }
    }
    appendNode = tree.AppendNode(colDatas.ToArray(), parentNode, data);
    if (!string.IsNullOrEmpty(beforWho))
    {
    TreeListNode afterWhoNode = FindNode(tree, beforWho);
    if (afterWhoNode != null && object.ReferenceEquals(afterWhoNode.ParentNode, parentNode))
    {
    // 增加顶级节点处理
    TreeListNodes nodes = afterWhoNode.ParentNode == null ? tree.Nodes : parentNode.Nodes;
    int afterWhoIndex = nodes.IndexOf(afterWhoNode);
    tree.SetNodeIndex(appendNode, afterWhoIndex);
    }
    }
    if (select)
    {
    appendNode.Selected = true;
    }
    //tree.Refresh();
    tree.EndUpdate();
    return appendNode;
    }
    #endregion
    #region [UpdateNode]
    /// <summary>
    /// 更新节点
    /// </summary>
    /// <typeparam name="T">节点类型</typeparam>
    /// <param name="tree">树控件</param>
    /// <param name="data">数据</param>
    /// <param name="select">是否选中修改节点</param>
    public static TreeListNode UpdateNode<T>(TreeList tree, T data, bool select) where T : IXtraTreeData
    {
    if (tree != null && data != null && !string.IsNullOrEmpty(data.NodeID))
    {
    tree.BeginUpdate();
    TreeListNode findNode = InnerUpdateNode(tree, data);
    //tree.Refresh();
    tree.EndUpdate();
    return findNode;
    }
    return null;
    }
    #endregion
    #region UpdateNodeList
    /// <summary>
    /// 批量更新节点列表
    /// </summary>
    /// <typeparam name="T">节点类型</typeparam>
    /// <param name="tree">树控件</param>
    /// <param name="dataList">数据列表</param>
    public static void UpdateNodeList<T>(TreeList tree, List<T> dataList) where T : IXtraTreeData
    {
    tree.BeginUpdate();
    foreach (var data in dataList)
    InnerUpdateNode(tree, data);
    tree.Refresh();
    tree.EndUpdate();
    }
    private static TreeListNode InnerUpdateNode<T>(TreeList tree, T data) where T : IXtraTreeData
    {
    if (tree != null && data != null && !string.IsNullOrEmpty(data.NodeID))
    {
    TreeListNode findNode = FindNode(tree, data.NodeID);
    if (findNode != null)
    {
    T oldData = (T)findNode.Tag;
    if (oldData != null)
    {
    data.NodeLevel = oldData.NodeLevel;
    data.Parent = oldData.Parent;
    // 保存原节点的子节点,避免在data == oldData的情况下被清空掉
    List<IXtraTreeData> childrenNode = oldData.Children.ToList();
    data.Children.Clear();
    data.Children.AddRange(childrenNode);
    ReplaceNodeData(findNode, data, oldData);
    }
    else
    oldData = data;
    foreach (TreeListColumn col in tree.Columns)
    {
    if (!string.IsNullOrEmpty(col.FieldName))
    {
    object fieldValue = data.GetPropertyValue(col.FieldName);
    oldData.SetPropertyValue(col.FieldName, fieldValue);
    findNode.SetValue(col.FieldName, fieldValue);
    }
    }
    }
    return findNode;
    }
    return null;
    }
    private static void ReplaceNodeData<T>(TreeListNode findNode, T data, T oldData) where T : IXtraTreeData
    {
    if (oldData.Parent != null)
    {
    var index = oldData.Parent.Children.IndexOf(oldData);
    oldData.Parent.Children.RemoveAt(index);
    oldData.Parent.Children.Insert(index, data);
    }
    foreach (var childNode in data.Children)
    {
    childNode.Parent = data;
    }
    findNode.Tag = data;
    }
    #endregion
    #region [RemoveNode]
    /// <summary>
    /// 移除节点
    /// </summary>
    /// <param name="tree">树控件</param>
    /// <param name="nodeID">节点ID</param>
    public static void RemoveNode(TreeList tree, string nodeID)
    {
    if (tree != null && !string.IsNullOrEmpty(nodeID))
    {
    tree.BeginUpdate();
    TreeListNode findNode;
    if (tree != null && !string.IsNullOrEmpty(nodeID))
    {
    findNode = FindNode(tree, nodeID);
    if (findNode != null)
    {
    if (findNode.ParentNode == null) // 顶级节点
    {
    var dataSource = tree.Tag as IList;
    if (dataSource != null && findNode.Tag != null)
    dataSource.Remove(findNode.Tag);
    tree.Nodes.Remove(findNode);
    }
    else
    {
    var parent = findNode.ParentNode.Tag as IXtraTreeData;
    if (parent != null && parent.Children != null && findNode.Tag is IXtraTreeData)
    parent.Children.Remove(findNode.Tag as IXtraTreeData);
    findNode.ParentNode.Nodes.Remove(findNode);
    }
    //tree.Refresh();
    }
    }
    tree.EndUpdate();
    }
    }
    #endregion
    #region [MoveUpNode]
    /// <summary>
    /// 上移节点
    /// </summary>
    /// <param name="tree">Tree控件</param>
    /// <param name="nodeID">上移节点ID</param>
    public static void MoveUpNode(TreeList tree, string nodeID)
    {
    if (tree != null && !string.IsNullOrEmpty(nodeID))
    {
    tree.BeginUpdate();
    TreeListNode findNode;
    findNode = FindNode(tree, nodeID);
    if (findNode != null)
    {
    var nodes = findNode.ParentNode == null ? tree.Nodes : findNode.ParentNode.Nodes;
    TreeListNode prevNode = findNode.PrevNode;
    if (prevNode != null && !ReferenceEquals(findNode, prevNode))
    {
    int index = nodes.IndexOf(findNode);
    int prevIndex = nodes.IndexOf(prevNode);
    tree.SetNodeIndex(findNode, prevIndex);
    tree.SetNodeIndex(prevNode, index);
    }
    findNode.Selected = true;
    MoveNodeDataUp(findNode);
    tree.Refresh();
    }
    tree.EndUpdate();
    }
    }
    /// <summary>
    /// 向下移动指定节点的数据
    /// </summary>
    /// <param name="findNode"></param>
    private static void MoveNodeDataUp(TreeListNode findNode)
    {
    if (findNode.ParentNode == null)
    return;
    var parentData = findNode.ParentNode.Tag as IXtraTreeData;
    if (parentData == null)
    return;
    var children = parentData.Children;
    var nodeData = findNode.Tag as IXtraTreeData;
    if (children == null || nodeData == null)
    return;
    var index = children.IndexOf(nodeData);
    if (index <= 0)
    return;
    children.Move(x => x == nodeData, index - 1);
    }
    #endregion
    #region [MoveTop]
    /// <summary>
    /// 移动节点到顶部
    /// </summary>
    /// <param name="tree">Tree控件</param>
    /// <param name="nodeID">上移节点ID</param>
    public static void MoveTop(TreeList tree, string nodeID)
    {
    if (tree != null && !string.IsNullOrEmpty(nodeID))
    {
    tree.BeginUpdate();
    TreeListNode findNode = FindNode(tree, nodeID);
    if (findNode != null)
    {
    var brotherNodes = findNode.ParentNode == null ? tree.Nodes : findNode.ParentNode.Nodes;
    var nodeIndex = brotherNodes.IndexOf(findNode);
    tree.SetNodeIndex(findNode, 0);
    foreach (TreeListNode treeListNode in brotherNodes.OfType<TreeListNode>().ToList())
    {
    var index = tree.GetNodeIndex(treeListNode);
    if (index < nodeIndex && findNode != treeListNode)
    tree.SetNodeIndex(treeListNode, index + 1);
    }
    MoveNodeDataTop(findNode);
    findNode.Selected = true;
    tree.Refresh();
    }
    tree.EndUpdate();
    }
    }
    /// <summary>
    /// 向下移动指定节点的数据
    /// </summary>
    /// <param name="findNode"></param>
    private static void MoveNodeDataTop(TreeListNode findNode)
    {
    if (findNode.ParentNode == null)
    return;
    var parentData = findNode.ParentNode.Tag as IXtraTreeData;
    if (parentData == null)
    return;
    var children = parentData.Children;
    var nodeData = findNode.Tag as IXtraTreeData;
    if (children == null || nodeData == null)
    return;
    children.MoveToBeginning(x => x == nodeData);
    }
    #endregion
    #region [MoveBottom]
    /// <summary>
    /// 移动节点到底部
    /// </summary>
    /// <param name="tree">Tree控件</param>
    /// <param name="nodeID">上移节点ID</param>
    public static void MoveBottom(TreeList tree, string nodeID)
    {
    if (tree != null && !string.IsNullOrEmpty(nodeID))
    {
    tree.BeginUpdate();
    TreeListNode findNode = FindNode(tree, nodeID);
    if (findNode != null)
    {
    var brotherNodes = findNode.ParentNode == null ? tree.Nodes : findNode.ParentNode.Nodes;
    var nodeIndex = brotherNodes.IndexOf(findNode);
    tree.SetNodeIndex(findNode, brotherNodes.Count - 1);
    foreach (TreeListNode treeListNode in brotherNodes.OfType<TreeListNode>().ToList())
    {
    var index = tree.GetNodeIndex(treeListNode);
    if (index > nodeIndex && findNode != treeListNode)
    tree.SetNodeIndex(treeListNode, index - 1);
    }
    MoveNodeDataBottom(findNode);
    findNode.Selected = true;
    tree.Refresh();
    }
    tree.EndUpdate();
    }
    }
    /// <summary>
    /// 移动指定节点的数据到底部
    /// </summary>
    /// <param name="findNode"></param>
    private static void MoveNodeDataBottom(TreeListNode findNode)
    {
    if (findNode.ParentNode == null)
    return;
    var parentData = findNode.ParentNode.Tag as IXtraTreeData;
    if (parentData == null)
    return;
    var children = parentData.Children;
    var nodeData = findNode.Tag as IXtraTreeData;
    if (children == null || nodeData == null)
    return;
    children.MoveToEnd(x => x == nodeData);
    }
    #endregion
    #region [MoveDownNode]
    /// <summary>
    /// 下移节点
    /// </summary>
    /// <param name="tree"></param>
    /// <param name="nodeID"></param>
    public static void MoveDownNode(TreeList tree, string nodeID)
    {
    if (tree != null && !string.IsNullOrEmpty(nodeID))
    {
    tree.BeginUpdate();
    TreeListNode findNode = FindNode(tree, nodeID);
    if (findNode != null)
    {
    var nodes = findNode.ParentNode == null ? tree.Nodes : findNode.ParentNode.Nodes;
    TreeListNode nextNode = findNode.NextNode;
    if (nextNode != null && !ReferenceEquals(findNode, nextNode))
    {
    int index = nodes.IndexOf(findNode);
    int nextIndex = nodes.IndexOf(nextNode);
    tree.SetNodeIndex(findNode, nextIndex);
    tree.SetNodeIndex(nextNode, index);
    }
    MoveNodeDataDown(findNode);
    findNode.Selected = true;
    tree.Refresh();
    }
    tree.EndUpdate();
    }
    }
    /// <summary>
    /// 向下移动指定节点的数据
    /// </summary>
    /// <param name="findNode"></param>
    private static void MoveNodeDataDown(TreeListNode findNode)
    {
    if (findNode.ParentNode == null)
    return;
    var parentData = findNode.ParentNode.Tag as IXtraTreeData;
    if (parentData == null)
    return;
    var children = parentData.Children;
    var nodeData = findNode.Tag as IXtraTreeData;
    if (children == null || nodeData == null)
    return;
    var index = children.IndexOf(nodeData);
    if (index < 0 || index == children.Count - 1)
    return;
    children.Move(x => x == nodeData, index + 1);
    }
    #endregion
    /// <summary>
    /// 固定列宽
    /// </summary>
    /// <param name="column">列</param>
    /// <param name="width">宽度</param>
    public static void FixTreeListColumnWidth(TreeListColumn column, int width)
    {
    column.MinWidth = column.Width = width;
    column.OptionsColumn.FixedWidth = true;
    }
    /// <summary>
    /// 向TreeList注册单元格中的提示信息
    /// 用户可根据节点,列来指定提示内容
    /// </summary>
    /// <typeparam name="TEntity">treeList上绑定的实体的类型</typeparam>
    /// <param name="treeList">要注册的TreeList</param>
    /// <param name="showTipsCondition">显示提示信息的条件</param>
    /// <param name="getCellHintText">获取显示文本的委托</param>
    /// <param name="getCellHintTitle">获取显示标题的委托,如果为空则显示列标题</param>
    public static void RegisteTreeCellHint<TEntity>(TreeList treeList, Func<TreeListHitInfo, bool> showTipsCondition, Func<TEntity, string> getCellHintText, Func<TreeListNode, TreeListColumn, string> getCellHintTitle = null)
    where TEntity : class
    {
    RegisteTreeCellHint(treeList, showTipsCondition,
    (node, column) => getCellHintText(treeList.GetDataRecordByNode(node) as TEntity),
    getCellHintTitle
    );
    }
    /// <summary>
    /// 向TreeList注册单元格中的提示信息
    /// 用户可根据节点,列来指定提示内容
    /// </summary>
    /// <param name="treeList">要注册的TreeList</param>
    /// <param name="showTipsCondition">显示提示信息的条件</param>
    /// <param name="getCellHintText">获取显示文本的委托</param>
    /// <param name="getCellHintTitle">获取显示标题的委托,如果为空则显示列标题</param>
    public static void RegisteTreeCellHint(TreeList treeList, Func<TreeListHitInfo, bool> showTipsCondition, Func<TreeListNode, TreeListColumn, string> getCellHintText, Func<TreeListNode, TreeListColumn, string> getCellHintTitle = null)
    {
    if (treeList == null)
    throw new ArgumentNullException("treeList");
    if (showTipsCondition == null)
    throw new ArgumentNullException("showTipsCondition");
    if (getCellHintText == null)
    throw new ArgumentNullException("getCellHintText");
    ToolTipController toolTipController = treeList.ToolTipController;
    if (toolTipController == null)
    {
    toolTipController = new ToolTipController { ToolTipType = ToolTipType.SuperTip };
    treeList.ToolTipController = toolTipController;
    }
    toolTipController.GetActiveObjectInfo += (sender, e) =>
    {
    if (e.SelectedControl != treeList) return;
    ToolTipControlInfo info = e.Info;
    try
    {
    var hi = treeList.CalcHitInfo(e.ControlMousePosition);
    if (hi.HitInfoType == HitInfoType.Cell && showTipsCondition(hi))
    {
    var hintText = getCellHintText(hi.Node, hi.Column);
    var hintTitle = getCellHintTitle == null ? hi.Column.Caption : getCellHintTitle(hi.Node, hi.Column);
    info = new ToolTipControlInfo(new TreeListCellToolTipInfo(hi.Node, hi.Column, null), hintText, hintTitle);
    }
    }
    finally
    {
    e.Info = info;
    }
    };
    }
    }
    /// <summary>
    /// Object扩展方法
    /// </summary>
    public static class ObjectExtends
    {
    #region [SetPropertyValue]
    /// <summary>
    /// 动态设置属性值
    /// </summary>
    /// <param name = "obj">要设置属性的对象</param>
    /// <param name = "propertyName">属性名</param>
    /// <param name = "value">值</param>
    public static void SetPropertyValue(this object obj, string propertyName, object value)
    {
    var type = obj.GetType();
    var property = type.GetProperty(propertyName);
    if (property == null)
    throw new ArgumentException(string.Format("属性'{0}'不存在.", propertyName), propertyName);
    if (!property.CanWrite)
    throw new ArgumentException(string.Format("属性'{0}'不可写.", propertyName), propertyName);
    property.SetValue(obj, value, null);
    }
    #endregion
    #region [GetPropertyValue]
    /// <summary>
    /// 通过反射动态获取属性值
    /// </summary>
    /// <param name = "obj">持有属性的对象</param>
    /// <param name = "propertyName">属性名</param>
    /// <returns>属性值</returns>
    public static object GetPropertyValue(this object obj, string propertyName)
    {
    return GetPropertyValue<object>(obj, propertyName, null);
    }



    /// <summary>
    /// 取得强类型属性值
    /// </summary>
    /// <typeparam name = "T">返回值类型</typeparam>
    /// <param name = "obj">持有属性的对象</param>
    /// <param name="defaultValue">默认值</param>
    /// <param name = "propertyName">属性名</param>
    /// <returns>属性值</returns>
    public static T GetPropertyValue<T>(this object obj, string propertyName, T defaultValue)
    {
    var type = obj.GetType();
    var property = type.GetProperty(propertyName);
    if (property == null)
    throw new ArgumentException(string.Format("属性'{0}'不存在.", propertyName), propertyName);
    var value = property.GetValue(obj, null);
    return (value is T ? (T)value : defaultValue);
    }
    #endregion
    #region [IsType]
    /// <summary>
    /// 对象是否为T类型
    /// </summary>
    public static bool IsType<T>(this object obj)
    {
    Type t = typeof(T);
    return (obj.GetType().Equals(t));
    }
    /// <summary>
    /// 取得对应类型默认值
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="value"></param>
    /// <returns></returns>
    public static T GetTypeDefaultValue<T>(this T value)
    {
    return default(T);
    }
    #endregion
    }
    /// <summary>
    /// <see cref="System.Collections.Generic.List{T}"/> 扩展方法
    /// </summary>
    public static class ListExtensions
    {
    /// <summary>
    /// Moves the item matching the <paramref name="itemSelector"/> to the end of the <paramref name="list"/>.
    /// </summary>
    public static void MoveToEnd<T>(this List<T> list, Predicate<T> itemSelector)
    {
    if (list == null)
    throw new ArgumentException(string.Format("参数'{0}'等于null。", list));
    if (list.Count > 1)
    list.Move(itemSelector, list.Count - 1);
    }
    /// <summary>
    /// Moves the item matching the <paramref name="itemSelector"/> to the beginning of the <paramref name="list"/>.
    /// </summary>
    public static void MoveToBeginning<T>(this List<T> list, Predicate<T> itemSelector)
    {
    if (list == null)
    throw new ArgumentException(string.Format("参数'{0}'等于null。", list));
    list.Move(itemSelector, 0);
    }
    /// <summary>
    /// 上移
    /// </summary>
    public static void MoveUp<T>(this List<T> list, T item)
    {
    if (list==null || list.Count==0 || item == null)
    return;
    var currIndex = list.IndexOf(item);
    if (currIndex <= 0)
    return;
    // 交换当前元素与上一元素
    list[currIndex] = list[currIndex - 1];
    list[currIndex - 1] = item;
    }
    /// <summary>
    /// 下移
    /// </summary>
    public static void MoveDown<T>(this List<T> list, T item)
    {
    if (list == null || list.Count == 0 || item == null)
    return;
    var currIndex = list.IndexOf(item);
    if (currIndex < 0 || currIndex == list.Count - 1)
    return;
    // 交换当前元素与下一元素
    list[currIndex] = list[currIndex + 1];
    list[currIndex + 1] = item;
    }
    /// <summary>
    /// Moves the item matching the <paramref name="itemSelector"/> to the <paramref name="newIndex"/> in the <paramref name="list"/>.
    /// </summary>
    public static void Move<T>(this List<T> list, Predicate<T> itemSelector, int newIndex)
    {
    if (list == null)
    throw new ArgumentException(string.Format("参数'{0}'等于null。", list));
    if (itemSelector == null)
    throw new ArgumentException(string.Format("参数'{0}'等于null。", itemSelector));
    if (newIndex < 0)
    return;
    var currentIndex = list.FindIndex(itemSelector);
    if (currentIndex < 0)
    return;
    if (currentIndex == newIndex)
    return;
    // Copy the item
    var item = list[currentIndex];
    // Remove the item from the list
    list.RemoveAt(currentIndex);
    // Finally insert the item at the new index
    list.Insert(newIndex, item);
    }
    }
    }
  • 相关阅读:
    python3.6中 字典类型和字符串类型互相转换的方法
    "sorted()"中的"Key Functions"
    tuple unpacking
    理解"__repr__"
    Python中的"Special Method"
    abstractmethod
    JavaScript括号中什么什么不加引号什么时候加引号?
    加载网页时速度慢的一些知识点
    Login登录页面的制作流程(摘要)
    JavaScript总结1
  • 原文地址:https://www.cnblogs.com/netsong/p/10277061.html
Copyright © 2020-2023  润新知