(四十七)c#Winform自定义控件-树表格(treeGrid)

用处及效果

准备工作

这个是在前面表格的基础上,扩展了自定义行实现的,当然也修改了一些列表控件以兼容

如果对前面的表格控件不了解,请移步查看

(三十二)c#Winform自定义控件-表格

开始

实现树表格的思路就是,在行控件中再添加一个无标题的表格控件,当需要显示子节点的时候,将子节点数据加载到行里的表格控件中,然后处理一下事件,让事件可以穿透到最顶层就行了。

另外我们前面表格中的行个数是根据高度大小自动计算的,这里就会出现问题,当出现子节点表格的时候,就会导致重算个数和高度,所有我们在表格列表控件增加一个属性来禁用这个自动计算。

添加一个用户控件,命名UCDataGridViewTreeRow,实现接口IDataGridViewRow

属性

#region 属性
        public event DataGridViewEventHandler CheckBoxChangeEvent;

        public event DataGridViewEventHandler CellClick;

        public event DataGridViewEventHandler SourceChanged;

        public List<DataGridViewColumnEntity> Columns
        {
            get;
            set;
        }

        public object DataSource
        {
            get;
            set;
        }

        public bool IsShowCheckBox
        {
            get;
            set;
        }
        private bool m_isChecked;
        public bool IsChecked
        {
            get
            {
                return m_isChecked;
            }

            set
            {
                if (m_isChecked != value)
                {
                    m_isChecked = value;
                    (this.panCells.Controls.Find("check", false)[0] as UCCheckBox).Checked = value;
                }
            }
        }

        int m_rowHeight = 40;
        public int RowHeight
        {
            get
            {
                return m_rowHeight;
            }
            set
            {
                m_rowHeight = value;
                this.Height = value;
            }
        }
        #endregion

构造函数处理一写东西,注意 this.ucDGVChild.ItemClick ,这个是将子节点表格的点击事件向上传递

public UCDataGridViewTreeRow()
        {
            InitializeComponent();
            this.ucDGVChild.RowType = this.GetType();
            this.ucDGVChild.IsAutoHeight = true;
            this.SizeChanged += UCDataGridViewTreeRow_SizeChanged;
            this.ucDGVChild.ItemClick += (a, b) =>
            {
                if (CellClick != null)
                {
                    CellClick(a, new DataGridViewEventArgs()
                    {
                        CellControl = (a as Control),
                        CellIndex = (a as Control).Tag.ToInt()
                    });
                }
            };

        }

实现接口函数BindingCellData,主要处理一下数据绑定后将子节点数据向下传递

public void BindingCellData()
        {
            for (int i = 0; i < Columns.Count; i++)
            {
                DataGridViewColumnEntity com = Columns[i];
                var cs = this.panCells.Controls.Find("lbl_" + com.DataField, false);
                if (cs != null && cs.Length > 0)
                {
                    var pro = DataSource.GetType().GetProperty(com.DataField);
                    if (pro != null)
                    {
                        var value = pro.GetValue(DataSource, null);
                        if (com.Format != null)
                        {
                            cs[0].Text = com.Format(value);
                        }
                        else
                        {
                            cs[0].Text = value.ToStringExt();
                        }
                    }
                }
            }
            panLeft.Tag = 0;
            var proChildrens = DataSource.GetType().GetProperty("Childrens");
            if (proChildrens != null)
            {
                var value = proChildrens.GetValue(DataSource, null);
                if (value != null)
                {
                    int intSourceCount = 0;
                    if (value is DataTable)
                    {
                        intSourceCount = (value as DataTable).Rows.Count;
                    }
                    else if (typeof(IList).IsAssignableFrom(value.GetType()))
                    {
                        intSourceCount = (value as IList).Count;
                    }
                    if (intSourceCount > 0)
                    {
                        panLeft.BackgroundImage = Properties.Resources.caret_right;
                        panLeft.Enabled = true;
                        panChildGrid.Tag = value;
                    }
                    else
                    {
                        panLeft.BackgroundImage = null;
                        panLeft.Enabled = false;
                        panChildGrid.Tag = null;
                    }
                }
                else
                {
                    panLeft.BackgroundImage = null;
                    panLeft.Enabled = false;
                    panChildGrid.Tag = null;
                }
            }
            else
            {
                panLeft.BackgroundImage = null;
                panLeft.Enabled = false;
                panChildGrid.Tag = null;
            }
        }

实现函数绑定列

public void ReloadCells()
        {
            try
            {
                ControlHelper.FreezeControl(this, true);
                this.panCells.Controls.Clear();
                this.panCells.ColumnStyles.Clear();

                int intColumnsCount = Columns.Count();
                if (Columns != null && intColumnsCount > 0)
                {
                    if (IsShowCheckBox)
                    {
                        intColumnsCount++;
                    }
                    this.panCells.ColumnCount = intColumnsCount;
                    for (int i = 0; i < intColumnsCount; i++)
                    {
                        Control c = null;
                        if (i == 0 && IsShowCheckBox)
                        {
                            this.panCells.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(SizeType.Absolute, 30F));

                            UCCheckBox box = new UCCheckBox();
                            box.Name = "check";
                            box.TextValue = "";
                            box.Size = new Size(30, 30);
                            box.Dock = DockStyle.Fill;
                            box.CheckedChangeEvent += (a, b) =>
                            {
                                IsChecked = box.Checked;
                                this.ucDGVChild.Rows.ForEach(p => p.IsChecked = box.Checked);
                                if (CheckBoxChangeEvent != null)
                                {
                                    CheckBoxChangeEvent(a, new DataGridViewEventArgs()
                                    {
                                        CellControl = box,
                                        CellIndex = 0
                                    });
                                }
                            };
                            c = box;
                        }
                        else
                        {
                            var item = Columns[i - (IsShowCheckBox ? 1 : 0)];
                            this.panCells.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(item.WidthType, item.Width));

                            Label lbl = new Label();
                            lbl.Tag = i - (IsShowCheckBox ? 1 : 0);
                            lbl.Name = "lbl_" + item.DataField;
                            lbl.Font = new Font("微软雅黑", 12);
                            lbl.ForeColor = Color.Black;
                            lbl.AutoSize = false;
                            lbl.Dock = DockStyle.Fill;
                            lbl.TextAlign = ContentAlignment.MiddleCenter;
                            lbl.MouseDown += (a, b) =>
                            {
                                Item_MouseDown(a, b);
                            };
                            c = lbl;
                        }
                        this.panCells.Controls.Add(c, i, 0);
                    }

                }
            }
            finally
            {
                ControlHelper.FreezeControl(this, false);
            }
        }

当点击展开图标的时候处理子节点的数据绑定以及高度计算

private void panLeft_MouseDown(object sender, MouseEventArgs e)
        {
            try
            {
                ControlHelper.FreezeControl(this.FindForm(), true);
                if (panLeft.Tag.ToInt() == 0)
                {
                    var value = panChildGrid.Tag;
                    if (value != null)
                    {
                        panLeft.BackgroundImage = Properties.Resources.caret_down;
                        panLeft.Tag = 1;
                        int intSourceCount = 0;
                        if (value is DataTable)
                        {
                            intSourceCount = (value as DataTable).Rows.Count;
                        }
                        else if (typeof(IList).IsAssignableFrom(value.GetType()))
                        {
                            intSourceCount = (value as IList).Count;
                        }
                        this.panChildGrid.Height = RowHeight * intSourceCount;
                        if (panChildGrid.Height > 0)
                        {
                            if (value != this.ucDGVChild.DataSource)
                            {
                                this.ucDGVChild.Columns = Columns;
                                this.ucDGVChild.RowHeight = RowHeight;
                                this.ucDGVChild.HeadPadingLeft = this.panLeft.Width;
                                this.ucDGVChild.IsShowCheckBox = IsShowCheckBox;
                                this.ucDGVChild.DataSource = value;
                                this.ucDGVChild.Rows.ForEach(p => p.IsChecked =this.IsChecked);
                            }
                        }
                    }

                }
                else
                {
                    panLeft.Tag = 0;
                    panChildGrid.Height = 0;
                    panLeft.BackgroundImage = Properties.Resources.caret_right;
                }
            }
            finally
            {
                ControlHelper.FreezeControl(this.FindForm(), false);
            }
        }

承载子节点表格的panel 在大小改变的时候,处理父级表格的大小。来防止出现多个滚动条

void UCDataGridViewTreeRow_SizeChanged(object sender, EventArgs e)
        {
            if (this.Parent.Parent.Parent != null && this.Parent.Parent.Parent.Name == "panChildGrid" && this.panLeft.Tag.ToInt() == 1)
            {
                int intHeight = this.Parent.Parent.Controls[0].Controls.ToArray().Sum(p => p.Height);
                if (this.Parent.Parent.Parent.Height != intHeight)
                    this.Parent.Parent.Parent.Height = intHeight;
            }
        }

完整代码

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 System.Collections;

namespace HZH_Controls.Controls
{
    [ToolboxItem(false)]
    public partial class UCDataGridViewTreeRow : UserControl, IDataGridViewRow
    {
        #region 属性
        public event DataGridViewEventHandler CheckBoxChangeEvent;

        public event DataGridViewEventHandler CellClick;

        public event DataGridViewEventHandler SourceChanged;

        public List<DataGridViewColumnEntity> Columns
        {
            get;
            set;
        }

        public object DataSource
        {
            get;
            set;
        }

        public bool IsShowCheckBox
        {
            get;
            set;
        }
        private bool m_isChecked;
        public bool IsChecked
        {
            get
            {
                return m_isChecked;
            }

            set
            {
                if (m_isChecked != value)
                {
                    m_isChecked = value;
                    (this.panCells.Controls.Find("check", false)[0] as UCCheckBox).Checked = value;
                }
            }
        }

        int m_rowHeight = 40;
        public int RowHeight
        {
            get
            {
                return m_rowHeight;
            }
            set
            {
                m_rowHeight = value;
                this.Height = value;
            }
        }
        #endregion

        public UCDataGridViewTreeRow()
        {
            InitializeComponent();
            this.ucDGVChild.RowType = this.GetType();
            this.ucDGVChild.IsAutoHeight = true;
            this.SizeChanged += UCDataGridViewTreeRow_SizeChanged;
            this.ucDGVChild.ItemClick += (a, b) =>
            {
                if (CellClick != null)
                {
                    CellClick(a, new DataGridViewEventArgs()
                    {
                        CellControl = (a as Control),
                        CellIndex = (a as Control).Tag.ToInt()
                    });
                }
            };

        }

        void UCDataGridViewTreeRow_SizeChanged(object sender, EventArgs e)
        {
            if (this.Parent.Parent.Parent != null && this.Parent.Parent.Parent.Name == "panChildGrid" && this.panLeft.Tag.ToInt() == 1)
            {
                int intHeight = this.Parent.Parent.Controls[0].Controls.ToArray().Sum(p => p.Height);
                if (this.Parent.Parent.Parent.Height != intHeight)
                    this.Parent.Parent.Parent.Height = intHeight;
            }
        }


        public void BindingCellData()
        {
            for (int i = 0; i < Columns.Count; i++)
            {
                DataGridViewColumnEntity com = Columns[i];
                var cs = this.panCells.Controls.Find("lbl_" + com.DataField, false);
                if (cs != null && cs.Length > 0)
                {
                    var pro = DataSource.GetType().GetProperty(com.DataField);
                    if (pro != null)
                    {
                        var value = pro.GetValue(DataSource, null);
                        if (com.Format != null)
                        {
                            cs[0].Text = com.Format(value);
                        }
                        else
                        {
                            cs[0].Text = value.ToStringExt();
                        }
                    }
                }
            }
            panLeft.Tag = 0;
            var proChildrens = DataSource.GetType().GetProperty("Childrens");
            if (proChildrens != null)
            {
                var value = proChildrens.GetValue(DataSource, null);
                if (value != null)
                {
                    int intSourceCount = 0;
                    if (value is DataTable)
                    {
                        intSourceCount = (value as DataTable).Rows.Count;
                    }
                    else if (typeof(IList).IsAssignableFrom(value.GetType()))
                    {
                        intSourceCount = (value as IList).Count;
                    }
                    if (intSourceCount > 0)
                    {
                        panLeft.BackgroundImage = Properties.Resources.caret_right;
                        panLeft.Enabled = true;
                        panChildGrid.Tag = value;
                    }
                    else
                    {
                        panLeft.BackgroundImage = null;
                        panLeft.Enabled = false;
                        panChildGrid.Tag = null;
                    }
                }
                else
                {
                    panLeft.BackgroundImage = null;
                    panLeft.Enabled = false;
                    panChildGrid.Tag = null;
                }
            }
            else
            {
                panLeft.BackgroundImage = null;
                panLeft.Enabled = false;
                panChildGrid.Tag = null;
            }
        }

        void Item_MouseDown(object sender, MouseEventArgs e)
        {
            if (CellClick != null)
            {
                CellClick(this, new DataGridViewEventArgs()
                {
                    CellControl = this,
                    CellIndex = (sender as Control).Tag.ToInt()
                });
            }
        }

        public void SetSelect(bool blnSelected)
        {
            if (blnSelected)
            {
                this.panMain.BackColor = Color.FromArgb(255, 247, 245);
            }
            else
            {
                this.panMain.BackColor = Color.Transparent;
            }
        }

        public void ReloadCells()
        {
            try
            {
                ControlHelper.FreezeControl(this, true);
                this.panCells.Controls.Clear();
                this.panCells.ColumnStyles.Clear();

                int intColumnsCount = Columns.Count();
                if (Columns != null && intColumnsCount > 0)
                {
                    if (IsShowCheckBox)
                    {
                        intColumnsCount++;
                    }
                    this.panCells.ColumnCount = intColumnsCount;
                    for (int i = 0; i < intColumnsCount; i++)
                    {
                        Control c = null;
                        if (i == 0 && IsShowCheckBox)
                        {
                            this.panCells.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(SizeType.Absolute, 30F));

                            UCCheckBox box = new UCCheckBox();
                            box.Name = "check";
                            box.TextValue = "";
                            box.Size = new Size(30, 30);
                            box.Dock = DockStyle.Fill;
                            box.CheckedChangeEvent += (a, b) =>
                            {
                                IsChecked = box.Checked;
                                this.ucDGVChild.Rows.ForEach(p => p.IsChecked = box.Checked);
                                if (CheckBoxChangeEvent != null)
                                {
                                    CheckBoxChangeEvent(a, new DataGridViewEventArgs()
                                    {
                                        CellControl = box,
                                        CellIndex = 0
                                    });
                                }
                            };
                            c = box;
                        }
                        else
                        {
                            var item = Columns[i - (IsShowCheckBox ? 1 : 0)];
                            this.panCells.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(item.WidthType, item.Width));

                            Label lbl = new Label();
                            lbl.Tag = i - (IsShowCheckBox ? 1 : 0);
                            lbl.Name = "lbl_" + item.DataField;
                            lbl.Font = new Font("微软雅黑", 12);
                            lbl.ForeColor = Color.Black;
                            lbl.AutoSize = false;
                            lbl.Dock = DockStyle.Fill;
                            lbl.TextAlign = ContentAlignment.MiddleCenter;
                            lbl.MouseDown += (a, b) =>
                            {
                                Item_MouseDown(a, b);
                            };
                            c = lbl;
                        }
                        this.panCells.Controls.Add(c, i, 0);
                    }

                }
            }
            finally
            {
                ControlHelper.FreezeControl(this, false);
            }
        }

        private void panChildGrid_SizeChanged(object sender, EventArgs e)
        {
            int intHeight = RowHeight + panChildGrid.Height;
            if (panChildGrid.Height != 0)
                this.ucDGVChild.Height = panChildGrid.Height;
            if (this.Height != intHeight)
                this.Height = intHeight;
        }

        private void panLeft_MouseDown(object sender, MouseEventArgs e)
        {
            try
            {
                ControlHelper.FreezeControl(this.FindForm(), true);
                if (panLeft.Tag.ToInt() == 0)
                {
                    var value = panChildGrid.Tag;
                    if (value != null)
                    {
                        panLeft.BackgroundImage = Properties.Resources.caret_down;
                        panLeft.Tag = 1;
                        int intSourceCount = 0;
                        if (value is DataTable)
                        {
                            intSourceCount = (value as DataTable).Rows.Count;
                        }
                        else if (typeof(IList).IsAssignableFrom(value.GetType()))
                        {
                            intSourceCount = (value as IList).Count;
                        }
                        this.panChildGrid.Height = RowHeight * intSourceCount;
                        if (panChildGrid.Height > 0)
                        {
                            if (value != this.ucDGVChild.DataSource)
                            {
                                this.ucDGVChild.Columns = Columns;
                                this.ucDGVChild.RowHeight = RowHeight;
                                this.ucDGVChild.HeadPadingLeft = this.panLeft.Width;
                                this.ucDGVChild.IsShowCheckBox = IsShowCheckBox;
                                this.ucDGVChild.DataSource = value;
                                this.ucDGVChild.Rows.ForEach(p => p.IsChecked =this.IsChecked);
                            }
                        }
                    }

                }
                else
                {
                    panLeft.Tag = 0;
                    panChildGrid.Height = 0;
                    panLeft.BackgroundImage = Properties.Resources.caret_right;
                }
            }
            finally
            {
                ControlHelper.FreezeControl(this.FindForm(), false);
            }
        }

        private void ucDGVChild_SizeChanged(object sender, EventArgs e)
        {

        }
    }
}
namespace HZH_Controls.Controls
{
    partial class UCDataGridViewTreeRow
    {
        /// <summary> 
        /// 必需的设计器变量。
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary> 
        /// 清理所有正在使用的资源。
        /// </summary>
        /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region 组件设计器生成的代码

        /// <summary> 
        /// 设计器支持所需的方法 - 不要
        /// 使用代码编辑器修改此方法的内容。
        /// </summary>
        private void InitializeComponent()
        {
            this.panCells = new System.Windows.Forms.TableLayoutPanel();
            this.panLeft = new System.Windows.Forms.Panel();
            this.panChildGrid = new System.Windows.Forms.Panel();
            this.panChildLeft = new System.Windows.Forms.Panel();
            this.panMain = new System.Windows.Forms.Panel();
            this.ucSplitLine_H1 = new HZH_Controls.Controls.UCSplitLine_H();
            this.ucDGVChild = new HZH_Controls.Controls.UCDataGridView();
            this.ucSplitLine_V1 = new HZH_Controls.Controls.UCSplitLine_V();
            this.panChildGrid.SuspendLayout();
            this.panMain.SuspendLayout();
            this.SuspendLayout();
            // 
            // panCells
            // 
            this.panCells.ColumnCount = 1;
            this.panCells.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
            this.panCells.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F));
            this.panCells.Dock = System.Windows.Forms.DockStyle.Fill;
            this.panCells.Location = new System.Drawing.Point(24, 0);
            this.panCells.Name = "panCells";
            this.panCells.RowCount = 1;
            this.panCells.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
            this.panCells.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 55F));
            this.panCells.Size = new System.Drawing.Size(637, 64);
            this.panCells.TabIndex = 2;
            // 
            // panLeft
            // 
            this.panLeft.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;
            this.panLeft.Dock = System.Windows.Forms.DockStyle.Left;
            this.panLeft.Location = new System.Drawing.Point(0, 0);
            this.panLeft.Name = "panLeft";
            this.panLeft.Size = new System.Drawing.Size(24, 64);
            this.panLeft.TabIndex = 0;
            this.panLeft.Tag = "0";
            this.panLeft.MouseDown += new System.Windows.Forms.MouseEventHandler(this.panLeft_MouseDown);
            // 
            // panChildGrid
            // 
            this.panChildGrid.Controls.Add(this.ucDGVChild);
            this.panChildGrid.Controls.Add(this.ucSplitLine_V1);
            this.panChildGrid.Controls.Add(this.panChildLeft);
            this.panChildGrid.Dock = System.Windows.Forms.DockStyle.Bottom;
            this.panChildGrid.Location = new System.Drawing.Point(0, 65);
            this.panChildGrid.Name = "panChildGrid";
            this.panChildGrid.Size = new System.Drawing.Size(661, 0);
            this.panChildGrid.TabIndex = 0;
            this.panChildGrid.SizeChanged += new System.EventHandler(this.panChildGrid_SizeChanged);
            // 
            // panChildLeft
            // 
            this.panChildLeft.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;
            this.panChildLeft.Dock = System.Windows.Forms.DockStyle.Left;
            this.panChildLeft.Location = new System.Drawing.Point(0, 0);
            this.panChildLeft.Name = "panChildLeft";
            this.panChildLeft.Size = new System.Drawing.Size(24, 0);
            this.panChildLeft.TabIndex = 1;
            this.panChildLeft.Tag = "0";
            // 
            // panMain
            // 
            this.panMain.Controls.Add(this.panCells);
            this.panMain.Controls.Add(this.panLeft);
            this.panMain.Dock = System.Windows.Forms.DockStyle.Fill;
            this.panMain.Location = new System.Drawing.Point(0, 0);
            this.panMain.Name = "panMain";
            this.panMain.Size = new System.Drawing.Size(661, 64);
            this.panMain.TabIndex = 0;
            // 
            // ucSplitLine_H1
            // 
            this.ucSplitLine_H1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(232)))), ((int)(((byte)(232)))), ((int)(((byte)(232)))));
            this.ucSplitLine_H1.Dock = System.Windows.Forms.DockStyle.Bottom;
            this.ucSplitLine_H1.Location = new System.Drawing.Point(0, 64);
            this.ucSplitLine_H1.Name = "ucSplitLine_H1";
            this.ucSplitLine_H1.Size = new System.Drawing.Size(661, 1);
            this.ucSplitLine_H1.TabIndex = 1;
            this.ucSplitLine_H1.TabStop = false;
            // 
            // ucDGVChild
            // 
            this.ucDGVChild.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
            | System.Windows.Forms.AnchorStyles.Right)));
            this.ucDGVChild.BackColor = System.Drawing.Color.White;
            this.ucDGVChild.HeadFont = new System.Drawing.Font("微软雅黑", 12F);
            this.ucDGVChild.HeadHeight = 40;
            this.ucDGVChild.HeadPadingLeft = 0;
            this.ucDGVChild.HeadTextColor = System.Drawing.Color.Black;
            this.ucDGVChild.IsAutoHeight = false;
            this.ucDGVChild.IsShowCheckBox = false;
            this.ucDGVChild.IsShowHead = false;
            this.ucDGVChild.Location = new System.Drawing.Point(25, 0);
            this.ucDGVChild.Name = "ucDGVChild";
            this.ucDGVChild.Page = null;
            this.ucDGVChild.RowHeight = 40;
            this.ucDGVChild.RowType = typeof(HZH_Controls.Controls.UCDataGridViewRow);
            this.ucDGVChild.Size = new System.Drawing.Size(636, 100);
            this.ucDGVChild.TabIndex = 0;
            this.ucDGVChild.SizeChanged += new System.EventHandler(this.ucDGVChild_SizeChanged);
            // 
            // ucSplitLine_V1
            // 
            this.ucSplitLine_V1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(232)))), ((int)(((byte)(232)))), ((int)(((byte)(232)))));
            this.ucSplitLine_V1.Dock = System.Windows.Forms.DockStyle.Left;
            this.ucSplitLine_V1.Location = new System.Drawing.Point(24, 0);
            this.ucSplitLine_V1.Name = "ucSplitLine_V1";
            this.ucSplitLine_V1.Size = new System.Drawing.Size(1, 0);
            this.ucSplitLine_V1.TabIndex = 0;
            this.ucSplitLine_V1.TabStop = false;
            // 
            // UCDataGridViewTreeRow
            // 
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
            this.BackColor = System.Drawing.Color.White;
            this.Controls.Add(this.panMain);
            this.Controls.Add(this.ucSplitLine_H1);
            this.Controls.Add(this.panChildGrid);
            this.Name = "UCDataGridViewTreeRow";
            this.Size = new System.Drawing.Size(661, 65);
            this.panChildGrid.ResumeLayout(false);
            this.panMain.ResumeLayout(false);
            this.ResumeLayout(false);

        }

        #endregion

        private System.Windows.Forms.TableLayoutPanel panCells;
        private UCSplitLine_H ucSplitLine_H1;
        private System.Windows.Forms.Panel panLeft;
        private System.Windows.Forms.Panel panChildGrid;
        private UCDataGridView ucDGVChild;
        private System.Windows.Forms.Panel panChildLeft;
        private System.Windows.Forms.Panel panMain;
        private UCSplitLine_V ucSplitLine_V1;
    }
}

我这里写死了,如果要使用树表格的话,子数据就要用属性Childrens,比如下面的实体就是了

public class TestModel
    {
        public string ID { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
        public DateTime Birthday { get; set; }
        public int Sex { get; set; }
        public List<TestModel> Childrens { get; set; }
    }

使用实例如下

this.ucDataGridView1.RowType = typeof(UCDataGridViewTreeRow);
            this.ucDataGridView1.IsAutoHeight = true;

            List<DataGridViewColumnEntity> lstCulumns = new List<DataGridViewColumnEntity>();
            lstCulumns.Add(new DataGridViewColumnEntity() { DataField = "ID", HeadText = "编号", Width = 70, WidthType = SizeType.Absolute });
            lstCulumns.Add(new DataGridViewColumnEntity() { DataField = "Name", HeadText = "姓名", Width = 50, WidthType = SizeType.Percent });
            lstCulumns.Add(new DataGridViewColumnEntity() { DataField = "Age", HeadText = "年龄", Width = 50, WidthType = SizeType.Percent });
            lstCulumns.Add(new DataGridViewColumnEntity() { DataField = "Birthday", HeadText = "生日", Width = 50, WidthType = SizeType.Percent, Format = (a) => { return ((DateTime)a).ToString("yyyy-MM-dd"); } });
            lstCulumns.Add(new DataGridViewColumnEntity() { DataField = "Sex", HeadText = "性别", Width = 50, WidthType = SizeType.Percent, Format = (a) => { return ((int)a) == 0 ? "女" : "男"; } });
            this.ucDataGridView1.Columns = lstCulumns;
            this.ucDataGridView1.IsShowCheckBox = true;
            List<object> lstSource = new List<object>();
            for (int i = 0; i < 200; i++)
            {
                TestModel model = new TestModel()
                {
                    ID = i.ToString(),
                    Age = 3 * i,
                    Name = "姓名——" + i,
                    Birthday = DateTime.Now.AddYears(-10),
                    Sex = i % 2
                };
                lstSource.Add(model);
                AddChilds(model, 5);
            }

            var page = new UCPagerControl2();
            page.DataSource = lstSource;
            this.ucDataGridView1.Page = page;
            this.ucDataGridView1.First();




  private void AddChilds(TestModel tm, int intCount)
        {
            if (intCount <= 0)
                return;
            tm.Childrens = new List<TestModel>();
            for (int i = 0; i < 5; i++)
            {
                TestModel model = new TestModel()
                {
                    ID = i.ToString(),
                    Age = 3 * i,
                    Name = intCount + "——" + i,
                    Birthday = DateTime.Now.AddYears(-10),
                    Sex = i % 2
                };
                tm.Childrens.Add(model);
                AddChilds(model, intCount - 1);
            }
        }

最后的话

如果你喜欢的话,请到 https://gitee.com/kwwwvagaa/net_winform_custom_control 点个星星吧

作者:冰封一夏
出处: http://www.hzhcontrols.com/doc.html
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,
且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
GitHub:https://github.com/kwwwvagaa/NetWinformControl
码云:https://gitee.com/kwwwvagaa/net_winform_custom_control.git

原文出处:冰封一夏

原文链接:https://www.cnblogs.com/bfyx/p/11412899.html

本文观点不代表Dotnet9立场,转载请联系原作者。

发表评论

登录后才能评论