最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#自定義組件實(shí)現(xiàn)表格的多層表頭功能

 更新時(shí)間:2024年12月13日 10:22:18   作者:數(shù)據(jù)的世界01  
這篇文章主要為大家詳細(xì)介紹了如何使用C#自定義組件實(shí)現(xiàn)表格的多層表頭功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

在 WinForms 中,想要實(shí)現(xiàn)多層表頭功能時(shí),DataGridView 本身并不支持該功能,而且又不希望使用第三方控件,因此選擇通過(guò)自定義組件來(lái)實(shí)現(xiàn)這一需求。

首先,展示一下程序?qū)崿F(xiàn)的效果:

接下來(lái),創(chuàng)建一個(gè)繼承自 DataGridView 的自定義組件。代碼如下:

using System;
using System.ComponentModel;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using System.Drawing;
 
namespace CellPaintingDataGridView
{
    public partial class TreeHeadDataGridView : DataGridView
    {
        private TreeView treeView1=new TreeView();
        public TreeHeadDataGridView()
        {
            InitializeComponent();
        }
 
        public TreeHeadDataGridView(IContainer container)
        {
            container.Add(this);
 
            InitializeComponent();
        }
 
 
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        public TreeNodeCollection HeadSource
        {
            get { return this.treeView1.Nodes; }
 
        }
 
 
        private int _cellHeight = 17;
        private int _columnDeep = 1;
        [Description("設(shè)置或獲得合并表頭樹(shù)的深度")]
        public int ColumnDeep
        {
            get
            {
                if (this.Columns.Count == 0)
                    _columnDeep = 1;
 
                this.ColumnHeadersHeight = _cellHeight * _columnDeep;
                return _columnDeep;
            }
 
            set
            {
                if (value < 1)
                    _columnDeep = 1;
                else
                    _columnDeep = value;
                this.ColumnHeadersHeight = _cellHeight * _columnDeep;
            }
        }
        
        ///<summary>
        ///繪制合并表頭
        ///</summary>
        ///<param name="node">合并表頭節(jié)點(diǎn)</param>
        ///<param name="e">繪圖參數(shù)集</param>
        ///<param name="level">結(jié)點(diǎn)深度</param>
        ///<remarks></remarks>
        public void PaintUnitHeader(TreeNode node, DataGridViewCellPaintingEventArgs e, int level)
        {
            //根節(jié)點(diǎn)時(shí)退出遞歸調(diào)用
            if (level == 0)
                return;
 
            RectangleF uhRectangle;
            int uhWidth;
            SolidBrush gridBrush = new SolidBrush(this.GridColor);
 
            Pen gridLinePen = new Pen(gridBrush);
            StringFormat textFormat = new StringFormat();
 
 
            textFormat.Alignment = StringAlignment.Center;
 
            uhWidth = GetUnitHeaderWidth(node);
 
            //與原貼算法有所區(qū)別在這。
            if (node.Nodes.Count == 0)
            {
                uhRectangle = new Rectangle(e.CellBounds.Left,
                            e.CellBounds.Top + node.Level * _cellHeight,
                            uhWidth - 1,
                            _cellHeight * (_columnDeep - node.Level) - 1);
            }
            else
            {
                uhRectangle = new Rectangle(
                            e.CellBounds.Left,
                            e.CellBounds.Top + node.Level * _cellHeight,
                            uhWidth - 1,
                            _cellHeight - 1);
            }
 
            Color backColor = e.CellStyle.BackColor;
            if (node.BackColor != Color.Empty)
            {
                backColor = node.BackColor;
            }
            SolidBrush backColorBrush = new SolidBrush(backColor);
            //畫(huà)矩形
            e.Graphics.FillRectangle(backColorBrush, uhRectangle);
 
            //劃底線
            e.Graphics.DrawLine(gridLinePen
                                , uhRectangle.Left
                                , uhRectangle.Bottom
                                , uhRectangle.Right
                                , uhRectangle.Bottom);
            //劃右端線
            e.Graphics.DrawLine(gridLinePen
                                , uhRectangle.Right
                                , uhRectangle.Top
                                , uhRectangle.Right
                                , uhRectangle.Bottom);
 
            寫(xiě)字段文本
            Color foreColor = Color.Black;
            if (node.ForeColor != Color.Empty)
            {
                foreColor = node.ForeColor;
            }
            e.Graphics.DrawString(node.Text, this.Font
                                    , new SolidBrush(foreColor)
                                    , uhRectangle.Left + uhRectangle.Width / 2 -
                                    e.Graphics.MeasureString(node.Text, this.Font).Width / 2 - 1
                                    , uhRectangle.Top +
                                    uhRectangle.Height / 2 - e.Graphics.MeasureString(node.Text, this.Font).Height / 2);
 
            遞歸調(diào)用()
            if (node.PrevNode == null)
                if (node.Parent != null)
                    PaintUnitHeader(node.Parent, e, level - 1);
        }
 
        /// <summary>
        /// 獲得合并標(biāo)題字段的寬度
        /// </summary>
        /// <param name="node">字段節(jié)點(diǎn)</param>
        /// <returns>字段寬度</returns>
        /// <remarks></remarks>
        private int GetUnitHeaderWidth(TreeNode node)
        {
            //獲得非最底層字段的寬度
 
            int uhWidth = 0;
            //獲得最底層字段的寬度
            if (node.Nodes == null)
                return this.Columns[GetColumnListNodeIndex(node)].Width;
 
            if (node.Nodes.Count == 0)
                return this.Columns[GetColumnListNodeIndex(node)].Width;
 
            for (int i = 0; i <= node.Nodes.Count - 1; i++)
            {
                uhWidth = uhWidth + GetUnitHeaderWidth(node.Nodes[i]);
            }
            return uhWidth;
        }
 
 
        /// <summary>
        /// 獲得底層字段索引
        /// </summary>
        /// <param name="node">底層字段節(jié)點(diǎn)</param>
        /// <returns>索引</returns>
        /// <remarks></remarks>
        private int GetColumnListNodeIndex(TreeNode node)
        {
            for (int i = 0; i <= _columnList.Count - 1; i++)
            {
                if (((TreeNode)_columnList[i]).Equals(node))
                    return i;
            }
            return -1;
        }
 
        private List<TreeNode> _columnList = new List<TreeNode>();
        [Description("最底層結(jié)點(diǎn)集合")]
        public List<TreeNode> NadirColumnList
        {
            get
            {
                if (this.treeView1 == null)
                    return null;
 
                if (this.treeView1.Nodes == null)
                    return null;
 
                if (this.treeView1.Nodes.Count == 0)
                    return null;
 
                _columnList.Clear();
                foreach (TreeNode node in this.treeView1.Nodes)
                {
                    //GetNadirColumnNodes(_columnList, node, false);
                    GetNadirColumnNodes(_columnList, node);
                }
                return _columnList;
            }
        }
 
        private void GetNadirColumnNodes(List<TreeNode> alList, TreeNode node)
        {
            if (node.FirstNode == null)
            {
                alList.Add(node);
            }
            foreach (TreeNode n in node.Nodes)
            {
                GetNadirColumnNodes(alList, n);
            }
        }
 
        /// <summary>
        /// 獲得底層字段集合
        /// </summary>
        /// <param name="alList">底層字段集合</param>
        /// <param name="node">字段節(jié)點(diǎn)</param>
        /// <param name="checked">向上搜索與否</param>
        /// <remarks></remarks>
        private void GetNadirColumnNodes(List<TreeNode> alList, TreeNode node, Boolean isChecked)
        {
            if (isChecked == false)
            {
                if (node.FirstNode == null)
                {
                    alList.Add(node);
                    if (node.NextNode != null)
                    {
                        GetNadirColumnNodes(alList, node.NextNode, false);
                        return;
                    }
                    if (node.Parent != null)
                    {
                        GetNadirColumnNodes(alList, node.Parent, true);
                        return;
                    }
                }
                else
                {
                    if (node.FirstNode != null)
                    {
                        GetNadirColumnNodes(alList, node.FirstNode, false);
                        return;
                    }
                }
            }
            else
            {
                if (node.FirstNode == null)
                {
                    return;
                }
                else
                {
                    if (node.NextNode != null)
                    {
                        GetNadirColumnNodes(alList, node.NextNode, false);
                        return;
                    }
 
                    if (node.Parent != null)
                    {
                        GetNadirColumnNodes(alList, node.Parent, true);
                        return;
                    }
                }
            }
        }
 
        /// <summary>
        /// 單元格繪制(重寫(xiě))
        /// </summary>
        /// <param name="e"></param>
        /// <remarks></remarks>
        protected override void OnCellPainting(DataGridViewCellPaintingEventArgs e)
        {
            //行標(biāo)題不重寫(xiě)
            if (e.ColumnIndex < 0)
            {
                base.OnCellPainting(e);
                return;
            }
 
            if (_columnDeep == 1)
            {
                base.OnCellPainting(e);
                return;
            }
 
            //繪制表頭
            if (e.RowIndex == -1)
            {
                PaintUnitHeader((TreeNode)NadirColumnList[e.ColumnIndex], e, _columnDeep);
                e.Handled = true;
            }
        }
 
    }
}

完成組件開(kāi)發(fā)后,可以將該控件從工具箱拖入界面,表頭的節(jié)點(diǎn)設(shè)置通過(guò) Designer.cs 中的 "Windows 窗體設(shè)計(jì)器生成的代碼" 實(shí)現(xiàn)。我們使用 System.Windows.Forms.TreeNode 來(lái)實(shí)現(xiàn)父子節(jié)點(diǎn)的綁定。示例代碼如下:

namespace CellPaintingDataGridView
{
    partial class Form1
    {
        /// <summary>
        /// 必需的設(shè)計(jì)器變量。
        /// </summary>
        private System.ComponentModel.IContainer components = null;
 
        /// <summary>
        /// 清理所有正在使用的資源。
        /// </summary>
        /// <param name="disposing">如果應(yīng)釋放托管資源,為 true;否則為 false。</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }
 
        #region Windows 窗體設(shè)計(jì)器生成的代碼
 
        /// <summary>
        /// 設(shè)計(jì)器支持所需的方法 - 不要
        /// 使用代碼編輯器修改此方法的內(nèi)容。
        /// </summary>
        private void InitializeComponent()
        {
            this.components = new System.ComponentModel.Container();
            System.Windows.Forms.TreeNode treeNode1 = new System.Windows.Forms.TreeNode("節(jié)點(diǎn)0");
            System.Windows.Forms.TreeNode treeNode2 = new System.Windows.Forms.TreeNode("節(jié)點(diǎn)1-0-0");
            System.Windows.Forms.TreeNode treeNode3 = new System.Windows.Forms.TreeNode("節(jié)點(diǎn)1-0-1");
            System.Windows.Forms.TreeNode treeNode4 = new System.Windows.Forms.TreeNode("節(jié)點(diǎn)1-0", new System.Windows.Forms.TreeNode[] {
            treeNode2,
            treeNode3});
            System.Windows.Forms.TreeNode treeNode5 = new System.Windows.Forms.TreeNode("節(jié)點(diǎn)1-1");
            System.Windows.Forms.TreeNode treeNode6 = new System.Windows.Forms.TreeNode("節(jié)點(diǎn)1", new System.Windows.Forms.TreeNode[] {
            treeNode4,
            treeNode5});
            System.Windows.Forms.TreeNode treeNode7 = new System.Windows.Forms.TreeNode("節(jié)點(diǎn)2-0");
            System.Windows.Forms.TreeNode treeNode8 = new System.Windows.Forms.TreeNode("節(jié)點(diǎn)2-1");
            System.Windows.Forms.TreeNode treeNode9 = new System.Windows.Forms.TreeNode("節(jié)點(diǎn)2-0");
            System.Windows.Forms.TreeNode treeNode10 = new System.Windows.Forms.TreeNode("節(jié)點(diǎn)2", new System.Windows.Forms.TreeNode[] {
            treeNode7,
            treeNode8,
            treeNode9});
            System.Windows.Forms.TreeNode treeNode11 = new System.Windows.Forms.TreeNode("節(jié)點(diǎn)3-0");
            System.Windows.Forms.TreeNode treeNode12 = new System.Windows.Forms.TreeNode("節(jié)點(diǎn)3-1");
            System.Windows.Forms.TreeNode treeNode13 = new System.Windows.Forms.TreeNode("節(jié)點(diǎn)3", new System.Windows.Forms.TreeNode[] {
            treeNode11,
            treeNode12});
            this.treeHeadDataGridView1 = new CellPaintingDataGridView.TreeHeadDataGridView(this.components);
            this.Column1 = new System.Windows.Forms.DataGridViewTextBoxColumn();
            this.Column2 = new System.Windows.Forms.DataGridViewTextBoxColumn();
            this.Column3 = new System.Windows.Forms.DataGridViewTextBoxColumn();
            this.Column4 = new System.Windows.Forms.DataGridViewTextBoxColumn();
            this.Column5 = new System.Windows.Forms.DataGridViewTextBoxColumn();
            this.Column6 = new System.Windows.Forms.DataGridViewTextBoxColumn();
            this.Column7 = new System.Windows.Forms.DataGridViewTextBoxColumn();
            this.Column8 = new System.Windows.Forms.DataGridViewTextBoxColumn();
            this.Column9 = new System.Windows.Forms.DataGridViewTextBoxColumn();
            ((System.ComponentModel.ISupportInitialize)(this.treeHeadDataGridView1)).BeginInit();
            this.SuspendLayout();
            // 
            // treeHeadDataGridView1
            // 
            this.treeHeadDataGridView1.ColumnDeep = 3;
            this.treeHeadDataGridView1.ColumnHeadersHeight = 51;
            this.treeHeadDataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.DisableResizing;
            this.treeHeadDataGridView1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
            this.Column1,
            this.Column2,
            this.Column3,
            this.Column4,
            this.Column5,
            this.Column6,
            this.Column7,
            this.Column8,
            this.Column9});
            treeNode1.Name = "節(jié)點(diǎn)";
            treeNode1.Text = "節(jié)點(diǎn)0";
            treeNode2.Name = "節(jié)點(diǎn)1-0-0";
            treeNode2.Text = "節(jié)點(diǎn)1-0-0";
            treeNode3.Name = "節(jié)點(diǎn)1-0-1";
            treeNode3.Text = "節(jié)點(diǎn)1-0-1";
            treeNode4.Name = "節(jié)點(diǎn)1-0";
            treeNode4.Text = "節(jié)點(diǎn)1-0";
            treeNode5.Name = "節(jié)點(diǎn)1-1";
            treeNode5.Text = "節(jié)點(diǎn)1-1";
            treeNode6.Name = "節(jié)點(diǎn)1";
            treeNode6.Text = "節(jié)點(diǎn)1";
            treeNode7.Name = "節(jié)點(diǎn)2-0";
            treeNode7.Text = "節(jié)點(diǎn)2-0";
            treeNode8.Name = "節(jié)點(diǎn)2-1";
            treeNode8.Text = "節(jié)點(diǎn)2-1";
            treeNode9.Name = "節(jié)點(diǎn)2-0";
            treeNode9.Text = "節(jié)點(diǎn)2-0";
            treeNode10.Name = "節(jié)點(diǎn)2";
            treeNode10.Text = "節(jié)點(diǎn)2";
            treeNode11.Name = "節(jié)點(diǎn)3-0";
            treeNode11.Text = "節(jié)點(diǎn)3-0";
            treeNode12.Name = "節(jié)點(diǎn)3-1";
            treeNode12.Text = "節(jié)點(diǎn)3-1";
            treeNode13.Name = "節(jié)點(diǎn)3";
            treeNode13.Text = "節(jié)點(diǎn)3";
            this.treeHeadDataGridView1.HeadSource.AddRange(new System.Windows.Forms.TreeNode[] {
            treeNode1,
            treeNode6,
            treeNode10,
            treeNode13});
            this.treeHeadDataGridView1.Location = new System.Drawing.Point(12, 12);
            this.treeHeadDataGridView1.Name = "treeHeadDataGridView1";
            this.treeHeadDataGridView1.RowTemplate.Height = 23;
            this.treeHeadDataGridView1.Size = new System.Drawing.Size(1034, 456);
            this.treeHeadDataGridView1.TabIndex = 0;
            // 
            // Column1
            // 
            this.Column1.HeaderText = "Column1";
            this.Column1.Name = "Column1";
            this.Column1.Width = 110;
            // 
            // Column2
            // 
            this.Column2.FillWeight = 80F;
            this.Column2.HeaderText = "Column2";
            this.Column2.Name = "Column2";
            // 
            // Column3
            // 
            this.Column3.FillWeight = 60F;
            this.Column3.HeaderText = "Column3";
            this.Column3.Name = "Column3";
            this.Column3.Width = 160;
            // 
            // Column4
            // 
            this.Column4.HeaderText = "Column4";
            this.Column4.Name = "Column4";
            // 
            // Column5
            // 
            this.Column5.HeaderText = "Column5";
            this.Column5.Name = "Column5";
            // 
            // Column6
            // 
            this.Column6.HeaderText = "Column6";
            this.Column6.Name = "Column6";
            // 
            // Column7
            // 
            this.Column7.HeaderText = "Column7";
            this.Column7.Name = "Column7";
            // 
            // Column8
            // 
            this.Column8.HeaderText = "Column8";
            this.Column8.Name = "Column8";
            // 
            // Column9
            // 
            this.Column9.HeaderText = "Column9";
            this.Column9.Name = "Column9";
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(1077, 533);
            this.Controls.Add(this.treeHeadDataGridView1);
            this.Name = "Form1";
            this.Text = "Form1";
            ((System.ComponentModel.ISupportInitialize)(this.treeHeadDataGridView1)).EndInit();
            this.ResumeLayout(false);
 
        }
 
        #endregion
 
        private TreeHeadDataGridView treeHeadDataGridView1;
        private System.Windows.Forms.DataGridViewTextBoxColumn Column1;
        private System.Windows.Forms.DataGridViewTextBoxColumn Column2;
        private System.Windows.Forms.DataGridViewTextBoxColumn Column3;
        private System.Windows.Forms.DataGridViewTextBoxColumn Column4;
        private System.Windows.Forms.DataGridViewTextBoxColumn Column5;
        private System.Windows.Forms.DataGridViewTextBoxColumn Column6;
        private System.Windows.Forms.DataGridViewTextBoxColumn Column7;
        private System.Windows.Forms.DataGridViewTextBoxColumn Column8;
        private System.Windows.Forms.DataGridViewTextBoxColumn Column9;
    }
}

通過(guò)這種方式,我們成功實(shí)現(xiàn)了多層表頭的功能,完全依賴自定義組件,不需要第三方控件。

到此這篇關(guān)于C#自定義組件實(shí)現(xiàn)表格的多層表頭功能的文章就介紹到這了,更多相關(guān)C#多層表頭內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#使用linq語(yǔ)句查詢數(shù)組中以特定字符開(kāi)頭元素的方法

    C#使用linq語(yǔ)句查詢數(shù)組中以特定字符開(kāi)頭元素的方法

    這篇文章主要介紹了C#使用linq語(yǔ)句查詢數(shù)組中以特定字符開(kāi)頭元素的方法,涉及C#使用linq進(jìn)行查詢的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-04-04
  • C#爬蟲(chóng)基礎(chǔ)之HttpClient獲取HTTP請(qǐng)求與響應(yīng)

    C#爬蟲(chóng)基礎(chǔ)之HttpClient獲取HTTP請(qǐng)求與響應(yīng)

    這篇文章介紹了C#使用HttpClient獲取HTTP請(qǐng)求與響應(yīng)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • 使用C#代碼修改Word文檔中的內(nèi)容控件

    使用C#代碼修改Word文檔中的內(nèi)容控件

    本文介紹了如何在C#項(xiàng)目中使用Spire.Docfor.NET庫(kù)對(duì)Word文檔中的內(nèi)容控件進(jìn)行修改,包括修改正文、段落、表格行、單元格以及單元格內(nèi)的內(nèi)容控件等內(nèi)容控件的具體步驟和示例代碼,需要的朋友可以參考下
    2026-04-04
  • C#獲取文件MD5值的實(shí)現(xiàn)示例

    C#獲取文件MD5值的實(shí)現(xiàn)示例

    文件的md5值,即文件簽名,為了驗(yàn)證文件的正確性,是否被惡意篡改等。每個(gè)文件有一個(gè)唯一的md5。下面這篇文中就給大家介紹了如何利用C#獲取文件MD5值,有需要的朋友們可以參考借鑒,下面來(lái)一起看看吧。
    2016-12-12
  • WPF InkCanvas基本操作方法詳解

    WPF InkCanvas基本操作方法詳解

    這篇文章主要為大家詳細(xì)介紹了WPF InkCanvas基本的操作方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • C#四舍五入用法實(shí)例

    C#四舍五入用法實(shí)例

    這篇文章主要為大家詳細(xì)介紹了C#四舍五入用法實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • C#中實(shí)現(xiàn)契約測(cè)試的方法

    C#中實(shí)現(xiàn)契約測(cè)試的方法

    這篇文章主要介紹了C#中實(shí)現(xiàn)契約測(cè)試,在本文中,我將揭開(kāi)契約測(cè)試的神秘面紗,并向您展示如何在 C# 項(xiàng)目中實(shí)現(xiàn)它,需要的朋友可以參考下
    2023-09-09
  • c#中禁用windows的任務(wù)管理器的方法

    c#中禁用windows的任務(wù)管理器的方法

    這篇文章主要介紹了c#中禁用windows的任務(wù)管理器的方法,通過(guò)注冊(cè)表實(shí)現(xiàn)禁用,需要的朋友可以參考下
    2014-06-06
  • C# 執(zhí)行CMD命令并接收返回結(jié)果的操作方式

    C# 執(zhí)行CMD命令并接收返回結(jié)果的操作方式

    這篇文章主要介紹了C# 執(zhí)行CMD命令并接收返回結(jié)果的操作方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • C#編程中枚舉類型的使用教程

    C#編程中枚舉類型的使用教程

    這篇文章主要介紹了C#編程中枚舉類型的使用,是C#入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2016-01-01

最新評(píng)論

新宁县| 芦山县| 启东市| 辽宁省| 沧源| 长宁县| 盘锦市| 会宁县| 遵义县| 东乌珠穆沁旗| 贵德县| 图们市| 南漳县| 纳雍县| 康定县| 新宁县| 平邑县| 昭平县| 观塘区| 手机| 顺平县| 札达县| 阿拉善左旗| 枣阳市| 乌兰浩特市| 定陶县| 九龙坡区| 枝江市| 来宾市| 延寿县| 盐山县| 江永县| 苍山县| 宣汉县| 房山区| 嘉善县| 广汉市| 观塘区| 深州市| 普兰店市| 什邡市|