/*********************** * 说明:树控件 * 创建人:姜棚 * 创建日期: * 修改人: * 修改日期: * 修改备注: * 版本:1.0.0.0 ***********************/ 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.XtraTreeList.Columns; using DevExpress.XtraTreeList; using DevExpress.XtraTreeList.Menu; using DevExpress.Utils.Menu; using DevExpress.XtraTreeList.Nodes; namespace Lskj.MyControl.TreeGridControl { public partial class TreeGridControlEx : UserControl { /// /// 树模型 /// /// The tree list object. public TreeList TreeListObj { get { return this.treeList1; } } /// /// 树双击 /// public EventHandler TreeDoubleClick; public TreeGridControlEx() { InitializeComponent(); } /// /// 说明:绑定树表 /// 创建人:姜棚 /// 创建日期:2018-08-20 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// 节点 /// 父节点 public void BindTreeGridEx(string keyFieldName, string parentFieldName) { this.treeList1.KeyFieldName = keyFieldName; this.treeList1.ParentFieldName = parentFieldName; } /// /// 说明:设置列 /// 创建人:姜棚 /// 创建日期:2018-08-17 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The table. /// The custom colum key. /// /// 设置树表格列 /// /// public void SetTreeColumn(DataTable dtFileds, bool isEdit = false) { for (int i = 0; i < dtFileds.Rows.Count; i++) { DataRow row = dtFileds.Rows[i]; TreeListColumn gridColumn = new TreeListColumn(); gridColumn.FieldName = row["fieldname"] + ""; gridColumn.Name = row["fieldname"] + ""; gridColumn.VisibleIndex = i; gridColumn.Caption = row["username1"] + ""; gridColumn.Width = Convert.ToInt32(row["width"]); gridColumn.Visible = ((Convert.ToInt32(row["width"]) > 0)); gridColumn.OptionsFilter.FilterPopupMode = DevExpress.XtraTreeList.FilterPopupMode.CheckedList; gridColumn.OptionsColumn.AllowEdit = isEdit; MyTagModel mode = new MyTagModel() { DefaultValue = row["defaultdate"].ToString(), Tag = gridColumn.Tag, calcExpr = row["calcExpr"].ToString(), unionFields = row["unionFields"] + "", unionValue = row["unionValue"] + "", lookupSql = row["fieldsql"] + "", lookupKey = row["fieldsqlid"] + "", lookupValue = row["fieldsqlname"] + "", fieldTypeId = Convert.ToInt32(row["fieldsqlTag"]) }; gridColumn.Tag = mode; string dataFormat = row["DataFormat"] + ""; Lskj.PubUtils.CommonUtils.DataFormat(gridColumn, row["DataFormat"] + "", 7); // 单据来源明细没有定义列类型,默认按照数字方式格式化 if (dtFileds.Columns.Contains("Accuracy")) SetColumnFormat(dtFileds.Rows[i]["Accuracy"] + "", gridColumn); bool isSum = dtFileds.Columns.Contains("isSum") && !String.IsNullOrEmpty(row["isSum"] + "") && Convert.ToInt32(row["isSum"]) == 1; SetColumnSummary(gridColumn, isSum, dataFormat); treeList1.Columns.AddRange(new DevExpress.XtraTreeList.Columns.TreeListColumn[] { gridColumn }); } } /// /// 说明:设置列统计 /// 创建人:姜棚 /// 创建日期:2018-08-17 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// public void SetColumnSummary(TreeListColumn gridColumn, bool isSum, string dataFormat) { if (gridColumn.VisibleIndex == 0) { this.treeList1.OptionsView.ShowSummaryFooter = true; gridColumn.AllNodesSummary = true; gridColumn.SummaryFooter = SummaryItemType.Count; gridColumn.RowFooterSummaryStrFormat = "合计:{0:#,###}行"; } else { if (isSum) { this.treeList1.OptionsView.ShowSummaryFooter = true; gridColumn.RowFooterSummary = DevExpress.XtraTreeList.SummaryItemType.Sum; gridColumn.AllNodesSummary = true; gridColumn.SummaryFooter = DevExpress.XtraTreeList.SummaryItemType.Sum; gridColumn.RowFooterSummaryStrFormat = "{0:" + dataFormat + "}"; } } } /// /// 说明:设置列格式化 /// 创建人:姜棚 /// 创建日期:2018-08-17 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// public void SetColumnFormat(string accuracy, TreeListColumn gridColumn) { if (!string.IsNullOrEmpty(accuracy) && accuracy != "0") { gridColumn.Format.FormatType = DevExpress.Utils.FormatType.Numeric; gridColumn.Format.FormatString = "F2"; } } /// /// 说明:设置数据源 /// 创建人:姜棚 /// 创建日期:2018-08-17 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// public void SetDataSource(DataTable dtSource) { this.treeList1.DataSource = dtSource; } /// /// 说明:添加树节点 /// 创建人:姜棚 /// 创建日期:2018-08-17 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// public TreeListNode AddTreeNode(bool lowerNode) { TreeListNode selectNode = this.treeList1.FocusedNode; if (!lowerNode && selectNode != null) selectNode = selectNode.ParentNode; return this.treeList1.AppendNode(null, selectNode); } /// /// 说明:刷新树节点(以先前展开状态进行刷新) /// 创建人:姜棚 /// 创建日期:2018-08-21 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// public void RefreshTreeNode(List treeNodes, TreeListNode focusNode) { foreach (TreeListNode node in treeNodes) { TreeListNode selectNode = this.treeList1.FindNodeByID(node.Id); if (selectNode != null) selectNode.Expanded = true; } if (focusNode != null) { //由于绑定数据源变了,要在现在树中找到原来记录的节点 focusNode = this.treeList1.FindNodeByID(focusNode.Id); this.treeList1.FocusedNode = focusNode; } } /// /// 说明:拖动节点前 /// 创建人:姜棚 /// 创建日期:2018-08-17 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The sender. /// The instance containing the event data. private void OnBeforeDragNode(object sender, DevExpress.XtraTreeList.BeforeDragNodeEventArgs e) { // 根据存储过程进行验证是否可拖动 //禁止拖动 //e.CanDrag = false; } /// /// 说明:拖动节点后 /// 创建人:姜棚 /// 创建日期:2018-08-17 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The sender. /// The instance containing the event data. private void OnAfterDragNode(object sender, DevExpress.XtraTreeList.NodeEventArgs e) { //存储过程验证 } /// /// 说明:获取选中行数据 /// 创建人:姜棚 /// 创建日期:2018-08-17 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The node. /// DataRow. private DataRow GetForcedNodeDataRow(TreeListNode node) { DataRowView dataRowView = this.treeList1.GetDataRecordByNode(node) as DataRowView; return dataRowView != null ? dataRowView.Row : null; } /// /// 说明:双击树表 /// 创建人:姜棚 /// 创建日期:2018-08-20 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The sender. /// The instance containing the event data. private void OnDoubleClick(object sender, EventArgs e) { if (TreeDoubleClick != null) TreeDoubleClick(this.treeList1.FocusedNode, null); } /// /// 说明:打开查找控件 /// 创建人:姜棚 /// 创建日期:2018-08-23 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// 通过引用传递的 ,它表示要处理的窗口消息。 /// 值之一,它表示要处理的键。 /// 如果字符已由控件处理,则为 true;否则为 false。 protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { switch (keyData) { //ctrl键按下 case Keys.Control | Keys.F: this.treeList1.ShowFindPanel(); break; } return false; } } }