293 lines
12 KiB
C#
293 lines
12 KiB
C#
/***********************
|
|
* 说明:树控件
|
|
* 创建人:姜棚
|
|
* 创建日期:
|
|
* 修改人:
|
|
* 修改日期:
|
|
* 修改备注:
|
|
* 版本: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
|
|
{
|
|
/// <summary>
|
|
/// 树模型
|
|
/// </summary>
|
|
/// <value>The tree list object.</value>
|
|
public TreeList TreeListObj { get { return this.treeList1; } }
|
|
/// <summary>
|
|
/// 树双击
|
|
/// </summary>
|
|
public EventHandler TreeDoubleClick;
|
|
|
|
public TreeGridControlEx()
|
|
{
|
|
InitializeComponent();
|
|
}
|
|
|
|
/// <summary>
|
|
/// <para>说明:绑定树表</para>
|
|
/// <para>创建人:姜棚</para>
|
|
/// <para>创建日期:2018-08-20 </para>
|
|
/// <para>修改人:</para>
|
|
/// <para>修改日期:</para>
|
|
/// <para>修改备注:</para>
|
|
/// <para>版本:1.0</para>
|
|
/// </summary>
|
|
/// <param name="keyFieldName">节点</param>
|
|
/// <param name="parentFieldName">父节点</param>
|
|
public void BindTreeGridEx(string keyFieldName, string parentFieldName)
|
|
{
|
|
this.treeList1.KeyFieldName = keyFieldName;
|
|
this.treeList1.ParentFieldName = parentFieldName;
|
|
}
|
|
/// <summary>
|
|
/// <para>说明:设置列</para>
|
|
/// <para>创建人:姜棚</para>
|
|
/// <para>创建日期:2018-08-17 </para>
|
|
/// <para>修改人:</para>
|
|
/// <para>修改日期:</para>
|
|
/// <para>修改备注:</para>
|
|
/// <para>版本:1.0</para>
|
|
/// </summary>
|
|
/// <param name="table">The table.</param>
|
|
/// <param name="customColumKey">The custom colum key.</param>
|
|
/// <summary>
|
|
/// 设置树表格列
|
|
/// </summary>
|
|
/// <param name="dtFileds"></param>
|
|
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 });
|
|
}
|
|
}
|
|
/// <summary>
|
|
/// <para>说明:设置列统计</para>
|
|
/// <para>创建人:姜棚</para>
|
|
/// <para>创建日期:2018-08-17 </para>
|
|
/// <para>修改人:</para>
|
|
/// <para>修改日期:</para>
|
|
/// <para>修改备注:</para>
|
|
/// <para>版本:1.0</para>
|
|
/// </summary>
|
|
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 + "}";
|
|
}
|
|
}
|
|
}
|
|
/// <summary>
|
|
/// <para>说明:设置列格式化</para>
|
|
/// <para>创建人:姜棚</para>
|
|
/// <para>创建日期:2018-08-17 </para>
|
|
/// <para>修改人:</para>
|
|
/// <para>修改日期:</para>
|
|
/// <para>修改备注:</para>
|
|
/// <para>版本:1.0</para>
|
|
/// </summary>
|
|
public void SetColumnFormat(string accuracy, TreeListColumn gridColumn)
|
|
{
|
|
if (!string.IsNullOrEmpty(accuracy) && accuracy != "0")
|
|
{
|
|
gridColumn.Format.FormatType = DevExpress.Utils.FormatType.Numeric;
|
|
gridColumn.Format.FormatString = "F2";
|
|
}
|
|
}
|
|
/// <summary>
|
|
/// <para>说明:设置数据源</para>
|
|
/// <para>创建人:姜棚</para>
|
|
/// <para>创建日期:2018-08-17 </para>
|
|
/// <para>修改人:</para>
|
|
/// <para>修改日期:</para>
|
|
/// <para>修改备注:</para>
|
|
/// <para>版本:1.0</para>
|
|
/// </summary>
|
|
public void SetDataSource(DataTable dtSource)
|
|
{
|
|
this.treeList1.DataSource = dtSource;
|
|
}
|
|
/// <summary>
|
|
/// <para>说明:添加树节点</para>
|
|
/// <para>创建人:姜棚</para>
|
|
/// <para>创建日期:2018-08-17 </para>
|
|
/// <para>修改人:</para>
|
|
/// <para>修改日期:</para>
|
|
/// <para>修改备注:</para>
|
|
/// <para>版本:1.0</para>
|
|
/// </summary>
|
|
public TreeListNode AddTreeNode(bool lowerNode)
|
|
{
|
|
TreeListNode selectNode = this.treeList1.FocusedNode;
|
|
if (!lowerNode && selectNode != null) selectNode = selectNode.ParentNode;
|
|
return this.treeList1.AppendNode(null, selectNode);
|
|
}
|
|
/// <summary>
|
|
/// <para>说明:刷新树节点(以先前展开状态进行刷新)</para>
|
|
/// <para>创建人:姜棚</para>
|
|
/// <para>创建日期:2018-08-21 </para>
|
|
/// <para>修改人:</para>
|
|
/// <para>修改日期:</para>
|
|
/// <para>修改备注:</para>
|
|
/// <para>版本:1.0</para>
|
|
/// </summary>
|
|
public void RefreshTreeNode(List<TreeListNode> 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;
|
|
}
|
|
}
|
|
/// <summary>
|
|
/// <para>说明:拖动节点前</para>
|
|
/// <para>创建人:姜棚</para>
|
|
/// <para>创建日期:2018-08-17 </para>
|
|
/// <para>修改人:</para>
|
|
/// <para>修改日期:</para>
|
|
/// <para>修改备注:</para>
|
|
/// <para>版本:1.0</para>
|
|
/// </summary>
|
|
/// <param name="sender">The sender.</param>
|
|
/// <param name="e">The <see cref="DevExpress.XtraTreeList.BeforeDragNodeEventArgs"/> instance containing the event data.</param>
|
|
private void OnBeforeDragNode(object sender, DevExpress.XtraTreeList.BeforeDragNodeEventArgs e)
|
|
{
|
|
// 根据存储过程进行验证是否可拖动
|
|
|
|
|
|
//禁止拖动
|
|
//e.CanDrag = false;
|
|
}
|
|
/// <summary>
|
|
/// <para>说明:拖动节点后</para>
|
|
/// <para>创建人:姜棚</para>
|
|
/// <para>创建日期:2018-08-17 </para>
|
|
/// <para>修改人:</para>
|
|
/// <para>修改日期:</para>
|
|
/// <para>修改备注:</para>
|
|
/// <para>版本:1.0</para>
|
|
/// </summary>
|
|
/// <param name="sender">The sender.</param>
|
|
/// <param name="e">The <see cref="DevExpress.XtraTreeList.NodeEventArgs"/> instance containing the event data.</param>
|
|
private void OnAfterDragNode(object sender, DevExpress.XtraTreeList.NodeEventArgs e)
|
|
{
|
|
//存储过程验证
|
|
|
|
|
|
|
|
|
|
}
|
|
/// <summary>
|
|
/// <para>说明:获取选中行数据</para>
|
|
/// <para>创建人:姜棚</para>
|
|
/// <para>创建日期:2018-08-17 </para>
|
|
/// <para>修改人:</para>
|
|
/// <para>修改日期:</para>
|
|
/// <para>修改备注:</para>
|
|
/// <para>版本:1.0</para>
|
|
/// </summary>
|
|
/// <param name="node">The node.</param>
|
|
/// <returns>DataRow.</returns>
|
|
private DataRow GetForcedNodeDataRow(TreeListNode node)
|
|
{
|
|
DataRowView dataRowView = this.treeList1.GetDataRecordByNode(node) as DataRowView;
|
|
return dataRowView != null ? dataRowView.Row : null;
|
|
}
|
|
/// <summary>
|
|
/// <para>说明:双击树表</para>
|
|
/// <para>创建人:姜棚</para>
|
|
/// <para>创建日期:2018-08-20 </para>
|
|
/// <para>修改人:</para>
|
|
/// <para>修改日期:</para>
|
|
/// <para>修改备注:</para>
|
|
/// <para>版本:1.0</para>
|
|
/// </summary>
|
|
/// <param name="sender">The sender.</param>
|
|
/// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>
|
|
private void OnDoubleClick(object sender, EventArgs e)
|
|
{
|
|
if (TreeDoubleClick != null)
|
|
TreeDoubleClick(this.treeList1.FocusedNode, null);
|
|
}
|
|
/// <summary>
|
|
/// <para>说明:打开查找控件</para>
|
|
/// <para>创建人:姜棚</para>
|
|
/// <para>创建日期:2018-08-23 </para>
|
|
/// <para>修改人:</para>
|
|
/// <para>修改日期:</para>
|
|
/// <para>修改备注:</para>
|
|
/// <para>版本:1.0</para>
|
|
/// </summary>
|
|
/// <param name="msg">通过引用传递的 <see cref="T:System.Windows.Forms.Message" />,它表示要处理的窗口消息。</param>
|
|
/// <param name="keyData"><see cref="T:System.Windows.Forms.Keys" /> 值之一,它表示要处理的键。</param>
|
|
/// <returns>如果字符已由控件处理,则为 true;否则为 false。</returns>
|
|
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
|
|
{
|
|
switch (keyData)
|
|
{
|
|
//ctrl键按下
|
|
case Keys.Control | Keys.F:
|
|
this.treeList1.ShowFindPanel();
|
|
break;
|
|
}
|
|
return false;
|
|
}
|
|
}
|
|
}
|