刚到一家新公司,领导下发任务要用cs系统做一个表格折叠显示,这真是把我难倒了,自己工作6年一直以来都是做BS的系统。这如果在BS里面那太简单了,JqGrid默认都自带,可是DataGridview不支持折叠啊。自己一点经验没有,怎么办呢?于是上网搜了相关视频,资料,开始学习起来。最后借鉴源码封了这么一个东西,发出来分享下,也能让自己加深印象。
首先不多说,上图。如果大家感谢还不错,请继续往下阅读:
大概的效果就是这样。
上代码。
1、首先重写DataGridview,代码如下:
public class MasterControl : DataGridView{#region 字段private List<int> rowCurrent = new List<int>();internal static int rowDefaultHeight = ;internal static int rowExpandedHeight = ;internal static int rowDefaultDivider = ;internal static int rowExpandedDivider = - ;internal static int rowDividerMargin = ;internal static bool collapseRow; //detailControl变量作为一个容器用来保存子表格public detailControl childView = new detailControl() { Visible = false }; // VBConversions Note: Initial value cannot be assigned here since it is non-static. Assignment has been moved to the class constructors.//internal System.Windows.Forms.ImageList RowHeaderIconList;private System.ComponentModel.Container components = null;//DataSet _cDataset;string _foreignKey;string _primaryKey;string _filterFormat;private controlType EControlType;public int ExpandRowIndex = ;#endregion#region 构造函数/// <summary>/// 通过传递过来的枚举判断是两级还是三级展开,表的对应关系通过Relations来读取/// 所以调用此构造函数的时候必须要讲Relations设置正确,才能正确显示层级关系。/// oDataSet.Relations.Add("", oDataSet.Tables["T"].Columns["Menu_ID"], oDataSet.Tables["T"].Columns["Menu_ID"]);/// oDataSet.Relations.Add("", oDataSet.Tables["T"].Columns["Menu_Name"], oDataSet.Tables["T"].Columns["Menu_Name"]);/// 这两次Add的顺序不能颠倒,必须先添加一、二级的表关联,再添加二、三级的表关联/// </summary>/// <param name="cDataset">数据源DataSet,里面还有各个表的对应关系</param>/// <param name="eControlType">枚举类型</param>public MasterControl(DataSet cDataset, controlType eControlType){SetMasterControl(cDataset, eControlType); }/// <summary>/// 第二种使用方法/// </summary>/// <param name="lstData">折叠控件第一层的集合</param>/// <param name="lstData">折叠控件第二层的集合</param>/// <param name="lstData">折叠控件第三层的集合</param>/// <param name="dicRelateKey">第一二层之间对应主外键</param>/// <param name="dicRelateKey">第二三层之间对应主外键</param>/// <param name="eControlType">枚举类型</param>public MasterControl(object lstData, object lstData, object lstData, Dictionary<string, string> dicRelateKey, Dictionary<string ,string>dicRelateKey, controlType eControlType){var oDataSet = new DataSet();try{var oTable = new DataTable();oTable = Fill(lstData);oTable.TableName = "T";var oTable = Fill(lstData);oTable.TableName = "T";if (lstData == null || dicRelateKey == null || dicRelateKey.Keys.Count <= ){oDataSet.Tables.AddRange(new DataTable[] { oTable, oTable });oDataSet.Relations.Add("", oDataSet.Tables["T"].Columns[dicRelateKey.Keys.FirstOrDefault()], oDataSet.Tables["T"].Columns[dicRelateKey.Values.FirstOrDefault()]);}else{var oTable = Fill(lstData);oTable.TableName = "T";oDataSet.Tables.AddRange(new DataTable[] { oTable, oTable, oTable });//这是对应关系的时候主键必须唯一oDataSet.Relations.Add("", oDataSet.Tables["T"].Columns[dicRelateKey.Keys.FirstOrDefault()], oDataSet.Tables["T"].Columns[dicRelateKey.Values.FirstOrDefault()]);oDataSet.Relations.Add("", oDataSet.Tables["T"].Columns[dicRelateKey.Keys.FirstOrDefault()], oDataSet.Tables["T"].Columns[dicRelateKey.Values.FirstOrDefault()]);}}catch{oDataSet = new DataSet();}SetMasterControl(oDataSet, eControlType);}/// <summary>/// 控件初始化/// </summary>private void InitializeComponent(){this.components = new System.ComponentModel.Container();base.RowHeaderMouseClick += new System.Windows.Forms.DataGridViewCellMouseEventHandler(MasterControl_RowHeaderMouseClick);base.RowPostPaint += new System.Windows.Forms.DataGridViewRowPostPaintEventHandler(MasterControl_RowPostPaint);base.Scroll += new System.Windows.Forms.ScrollEventHandler(MasterControl_Scroll);base.SelectionChanged += new System.EventHandler(MasterControl_SelectionChanged);System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MasterControl));this.RowHeaderIconList = new System.Windows.Forms.ImageList(this.components);((System.ComponentModel.ISupportInitialize)this).BeginInit();this.SuspendLayout();////RowHeaderIconList//this.RowHeaderIconList.ImageStream = (System.Windows.Forms.ImageListStreamer)(resources.GetObject("RowHeaderIconList.ImageStream"));this.RowHeaderIconList.TransparentColor = System.Drawing.Color.Transparent;this.RowHeaderIconList.Images.SetKeyName(, "expand.png");this.RowHeaderIconList.Images.SetKeyName(, "collapse.png");////MasterControl//((System.ComponentModel.ISupportInitialize)this).EndInit();this.ResumeLayout(false);}#endregion#region 数据绑定/// <summary>/// 设置表之间的主外键关联/// </summary>/// <param name="tableName">DataTable的表名称</param>/// <param name="foreignKey">外键</param>public void setParentSource(string tableName, string primarykey, string foreignKey){this.DataSource = new DataView(_cDataset.Tables[tableName]);cModule.setGridRowHeader(this);_foreignKey = foreignKey;_primaryKey = primarykey;if (_cDataset.Tables[tableName].Columns[primarykey].GetType().ToString() == typeof(int).ToString()|| _cDataset.Tables[tableName].Columns[primarykey].GetType().ToString() == typeof(double).ToString()|| _cDataset.Tables[tableName].Columns[primarykey].GetType().ToString() == typeof(decimal).ToString()){_filterFormat = foreignKey + "={}";}else{_filterFormat = foreignKey + "=/'{}/'";}}#endregion#region 事件//控件的行头点击事件private void MasterControl_RowHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e){try{Rectangle rect = new Rectangle(System.Convert.ToInt((double)(rowDefaultHeight - ) / ), System.Convert.ToInt((double)(rowDefaultHeight - ) / ), , );if (rect.Contains(e.Location)){//缩起if (rowCurrent.Contains(e.RowIndex)){rowCurrent.Clear();this.Rows[e.RowIndex].Height = rowDefaultHeight;this.Rows[e.RowIndex].DividerHeight = rowDefaultDivider;this.ClearSelection();collapseRow = true;this.Rows[e.RowIndex].Selected = true;if (EControlType == controlType.middle){var oParent = ((MasterControl)this.Parent.Parent);oParent.Rows[oParent.ExpandRowIndex].Height = rowDefaultHeight * (this.Rows.Count + );oParent.Rows[oParent.ExpandRowIndex].DividerHeight = rowDefaultHeight * (this.Rows.Count + );if (oParent.Rows[oParent.ExpandRowIndex].Height > ){oParent.Rows[oParent.ExpandRowIndex].Height = ;oParent.Rows[oParent.ExpandRowIndex].Height = ;}}}//展开else{if (!(rowCurrent.Count == )){var eRow = rowCurrent[];rowCurrent.Clear();this.Rows[eRow].Height = rowDefaultHeight;this.Rows[eRow].DividerHeight = rowDefaultDivider;this.ClearSelection();collapseRow = true;this.Rows[eRow].Selected = true;}rowCurrent.Add(e.RowIndex);this.ClearSelection();collapseRow = true;this.Rows[e.RowIndex].Selected = true;this.ExpandRowIndex = e.RowIndex;this.Rows[e.RowIndex].Height = + rowDefaultHeight * (((DataView)(childView.childGrid[].DataSource)).Count + );this.Rows[e.RowIndex].DividerHeight = + rowDefaultHeight * (((DataView)(childView.childGrid[].DataSource)).Count);//设置一个最大高度if (this.Rows[e.RowIndex].Height > ){this.Rows[e.RowIndex].Height = ;this.Rows[e.RowIndex].DividerHeight = ;}if (EControlType == controlType.middle){if (this.Parent.Parent.GetType() != typeof(MasterControl))return;var oParent = ((MasterControl)this.Parent.Parent);oParent.Rows[oParent.ExpandRowIndex].Height = this.Rows[e.RowIndex].Height + rowDefaultHeight * (this.Rows.Count + );oParent.Rows[oParent.ExpandRowIndex].DividerHeight = this.Rows[e.RowIndex].DividerHeight + rowDefaultHeight * (this.Rows.Count + );if (oParent.Rows[oParent.ExpandRowIndex].Height > ){oParent.Rows[oParent.ExpandRowIndex].Height = ;oParent.Rows[oParent.ExpandRowIndex].Height = ;}}//if (EControlType == controlType.outside)//{// //SetControl(this);//}//this.Rows[e.RowIndex].Height = rowExpandedHeight;//this.Rows[e.RowIndex].DividerHeight = rowExpandedDivider;}//this.ClearSelection();//collapseRow = true;//this.Rows[e.RowIndex].Selected = true;}else{collapseRow = false;}}catch (Exception ex){}}//控件的行重绘事件private void MasterControl_RowPostPaint(object obj_sender, DataGridViewRowPostPaintEventArgs e){try{var sender = (DataGridView)obj_sender;//set childview controlvar rect = new Rectangle((int)(e.RowBounds.X + ((double)(rowDefaultHeight - ) / )), (int)(e.RowBounds.Y + ((double)(rowDefaultHeight - ) / )), , );if (collapseRow){if (this.rowCurrent.Contains(e.RowIndex)){#region 更改点开后背景色 刘金龙var rect = new Rectangle(e.RowBounds.X, e.RowBounds.Y + rowDefaultHeight, e.RowBounds.Width, e.RowBounds.Height - rowDefaultHeight);using (Brush b = new SolidBrush(Color.FromArgb(, , ))){e.Graphics.FillRectangle(b, rect);} #endregionsender.Rows[e.RowIndex].DividerHeight = sender.Rows[e.RowIndex].Height - rowDefaultHeight;e.Graphics.DrawImage(RowHeaderIconList.Images[(int)rowHeaderIcons.collapse], rect);childView.Location = new Point(e.RowBounds.Left + sender.RowHeadersWidth, e.RowBounds.Top + rowDefaultHeight + );childView.Width = e.RowBounds.Right - sender.RowHeadersWidth;childView.Height = System.Convert.ToInt(sender.Rows[e.RowIndex].DividerHeight - );childView.Visible = true;}else{childView.Visible = false;e.Graphics.DrawImage(RowHeaderIconList.Images[(int)rowHeaderIcons.expand], rect);}collapseRow = false;}else{if (this.rowCurrent.Contains(e.RowIndex)){#region 更改点开后背景色 刘金龙var rect = new Rectangle(e.RowBounds.X, e.RowBounds.Y + rowDefaultHeight, e.RowBounds.Width, e.RowBounds.Height - rowDefaultHeight);using (Brush b = new SolidBrush(Color.FromArgb(,,))){e.Graphics.FillRectangle(b, rect);} #endregionsender.Rows[e.RowIndex].DividerHeight = sender.Rows[e.RowIndex].Height - rowDefaultHeight;e.Graphics.DrawImage(RowHeaderIconList.Images[(int)rowHeaderIcons.collapse], rect);childView.Location = new Point(e.RowBounds.Left + sender.RowHeadersWidth, e.RowBounds.Top + rowDefaultHeight + );childView.Width = e.RowBounds.Right - sender.RowHeadersWidth;childView.Height = System.Convert.ToInt(sender.Rows[e.RowIndex].DividerHeight - );childView.Visible = true;}else{childView.Visible = false;e.Graphics.DrawImage(RowHeaderIconList.Images[(int)rowHeaderIcons.expand], rect);}}cModule.rowPostPaint_HeaderCount(sender, e);}catch{}}//控件的滚动条滚动事件private void MasterControl_Scroll(object sender, ScrollEventArgs e){try{if (!(rowCurrent.Count == )){collapseRow = true;this.ClearSelection();this.Rows[rowCurrent[]].Selected = true;}}catch{}}//控件的单元格选择事件private void MasterControl_SelectionChanged(object sender, EventArgs e){try{if (!(this.RowCount == )){if (rowCurrent.Contains(this.CurrentRow.Index)){foreach (DataGridView cGrid in childView.childGrid){((DataView)cGrid.DataSource).RowFilter = string.Format(_filterFormat, this[_primaryKey, this.CurrentRow.Index].Value);}}}}catch{}}#endregion#region Private//设置构造函数的参数private void SetMasterControl(DataSet cDataset, controlType eControlType){//.控件初始化赋值this.Controls.Add(childView);InitializeComponent();_cDataset = cDataset;childView._cDataset = cDataset;cModule.applyGridTheme(this);Dock = DockStyle.Fill;EControlType = eControlType;this.AllowUserToAddRows = false;//.通过读取DataSet里面的Relations得到表的关联关系if (cDataset.Relations.Count <= ){return;}DataRelation oRelates;if (eControlType == controlType.outside){oRelates = cDataset.Relations[];childView.Add(oRelates.ParentTable.TableName, oRelates.ParentColumns[].ColumnName, oRelates.ChildColumns[].ColumnName);}else if (eControlType == controlType.middle){oRelates = cDataset.Relations[cDataset.Relations.Count - ];childView.Add(oRelates.ChildTable.TableName);}//.设置主外键对应关系oRelates = cDataset.Relations[];//主表里面的值,副表里面的过滤字段setParentSource(oRelates.ParentTable.TableName,oRelates.ParentColumns[].ColumnName, oRelates.ChildColumns[].ColumnName);}private void SetControl(MasterControl oGrid){oGrid.childView.RemoveControl();//oGrid.childView.Controls.RemoveByKey("ChildrenMaster");////var oRelates = _cDataset.Relations[];//oGrid.childView.Add(oRelates.ParentTable.TableName, oRelates.ChildColumns[].ColumnName);//foreach (var oGridControl in oGrid.Controls)//{// if (oGridControl.GetType() != typeof(detailControl))// {// continue;// }// var DetailControl =(detailControl)oGridControl;// foreach (var odetailControl in DetailControl.Controls)// {// if (odetailControl.GetType() != typeof(MasterControl))// {// continue;// }// var OMasterControl = (MasterControl)odetailControl;// foreach (var oMasterControl in OMasterControl.Controls)// {// if (oMasterControl.GetType() == typeof(detailControl))// {// ((detailControl)oMasterControl).Visible = false;// return;// }// }// }//}}//将List集合转换成DataTableprivate DataTable Fill(object obj){if(!(obj is IList)){return null;}var objlist = obj as IList;if (objlist == null || objlist.Count <= ){return null;}var tType = objlist[];DataTable dt = new DataTable(tType.GetType().Name);DataColumn column;DataRow row;System.Reflection.PropertyInfo[] myPropertyInfo = tType.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);foreach (var t in objlist){if (t == null){continue;}row = dt.NewRow();for (int i = , j = myPropertyInfo.Length; i < j; i++){System.Reflection.PropertyInfo pi = myPropertyInfo[i];string name = pi.Name;if (dt.Columns[name] == null){column = new DataColumn(name, pi.PropertyType);dt.Columns.Add(column);}row[name] = pi.GetValue(t, null);}dt.Rows.Add(row);}return dt;}#endregion}
2、detailControl变量作为一个容器用来保存子表格
代码如下:
public class detailControl : Ewin.Client.Frame.Controls.EwinPanel{#region 字段public List<DataGridView> childGrid = new List<DataGridView>();public DataSet _cDataset;#endregion#region 方法public void Add(string tableName, string strPrimaryKey, string strForeignKey){//TabPage tPage = new TabPage() { Text = pageCaption };//this.Controls.Add(tPage);var newGrid = new MasterControl(_cDataset, controlType.middle) { Dock = DockStyle.Fill, DataSource = new DataView(_cDataset.Tables[tableName]) };newGrid.setParentSource(tableName, strPrimaryKey, strForeignKey);//设置主外键//newGrid.Name = "ChildrenMaster";//tPage.Controls.Add(newGrid);this.Controls.Add(newGrid);//this.BorderStyle = BorderStyle.FixedSingle;cModule.applyGridTheme(newGrid);cModule.setGridRowHeader(newGrid);newGrid.RowPostPaint += cModule.rowPostPaint_HeaderCount;childGrid.Add(newGrid);}public void Add(string tableName){//TabPage tPage = new TabPage() { Text = pageCaption };//this.Controls.Add(tPage);DataGridView newGrid = new Ewin.Client.Frame.Controls.EwinGrid() { Dock = DockStyle.Fill, DataSource = new DataView(_cDataset.Tables[tableName]) };newGrid.AllowUserToAddRows = false;//tPage.Controls.Add(newGrid);this.Controls.Add(newGrid);cModule.applyGridTheme(newGrid);cModule.setGridRowHeader(newGrid);newGrid.RowPostPaint += cModule.rowPostPaint_HeaderCount;childGrid.Add(newGrid);}public void RemoveControl(){this.Controls.Remove(childGrid[]);childGrid.Clear();}#endregion}
3、cModule.cs用来设置样式
namespace Ewin.Client.Frame.UcGrid{/// <summary>/// 折叠控件样式以及行数操作类/// </summary>sealed class cModule{#region CustomGridstatic System.Windows.Forms.DataGridViewCellStyle dateCellStyle = new System.Windows.Forms.DataGridViewCellStyle { Alignment = DataGridViewContentAlignment.MiddleRight };static System.Windows.Forms.DataGridViewCellStyle amountCellStyle = new System.Windows.Forms.DataGridViewCellStyle { Alignment = DataGridViewContentAlignment.MiddleRight, Format = "N" };static System.Windows.Forms.DataGridViewCellStyle gridCellStyle = new System.Windows.Forms.DataGridViewCellStyle{Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft,BackColor = System.Drawing.Color.FromArgb(System.Convert.ToInt(System.Convert.ToByte()), System.Convert.ToInt(System.Convert.ToByte()), System.Convert.ToInt(System.Convert.ToByte())),Font = new System.Drawing.Font("Segoe UI", (float)(.F), System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte()),ForeColor = System.Drawing.SystemColors.ControlLightLight,SelectionBackColor = System.Drawing.SystemColors.Highlight,SelectionForeColor = System.Drawing.SystemColors.HighlightText,WrapMode = System.Windows.Forms.DataGridViewTriState.True};static System.Windows.Forms.DataGridViewCellStyle gridCellStyle = new System.Windows.Forms.DataGridViewCellStyle{Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft,BackColor = System.Drawing.SystemColors.ControlLightLight,Font = new System.Drawing.Font("Segoe UI", (float)(.F), System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte()),ForeColor = System.Drawing.SystemColors.ControlText,SelectionBackColor = System.Drawing.Color.FromArgb(System.Convert.ToInt(System.Convert.ToByte()), System.Convert.ToInt(System.Convert.ToByte()), System.Convert.ToInt(System.Convert.ToByte())),SelectionForeColor = System.Drawing.SystemColors.HighlightText,WrapMode = System.Windows.Forms.DataGridViewTriState.False};static System.Windows.Forms.DataGridViewCellStyle gridCellStyle = new System.Windows.Forms.DataGridViewCellStyle{Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft,BackColor = System.Drawing.Color.WhiteSmoke,Font = new System.Drawing.Font("Segoe UI", (float)(.F), System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte()),ForeColor = System.Drawing.SystemColors.WindowText,SelectionBackColor = System.Drawing.Color.FromArgb(System.Convert.ToInt(System.Convert.ToByte()), System.Convert.ToInt(System.Convert.ToByte()), System.Convert.ToInt(System.Convert.ToByte())),SelectionForeColor = System.Drawing.SystemColors.HighlightText,WrapMode = System.Windows.Forms.DataGridViewTriState.True};//设置表格的主题样式static public void applyGridTheme(DataGridView grid){grid.AllowUserToAddRows = false;grid.AllowUserToDeleteRows = false;grid.BackgroundColor = System.Drawing.SystemColors.Window;grid.BorderStyle = System.Windows.Forms.BorderStyle.None;grid.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single;grid.ColumnHeadersDefaultCellStyle = gridCellStyle;grid.ColumnHeadersHeight = ;grid.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.DisableResizing;grid.DefaultCellStyle = gridCellStyle;grid.EnableHeadersVisualStyles = false;grid.GridColor = System.Drawing.SystemColors.GradientInactiveCaption;//grid.ReadOnly = true;grid.RowHeadersVisible = true;grid.RowHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single;grid.RowHeadersDefaultCellStyle = gridCellStyle;grid.Font = gridCellStyle.Font;}//设置表格单元格样式static public void setGridRowHeader(DataGridView dgv, bool hSize = false){dgv.TopLeftHeaderCell.Value = "NO ";dgv.TopLeftHeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter;dgv.AutoResizeRowHeadersWidth(DataGridViewRowHeadersWidthSizeMode.AutoSizeToDisplayedHeaders);foreach (DataGridViewColumn cCol in dgv.Columns){if (cCol.ValueType.ToString() == typeof(DateTime).ToString()){cCol.DefaultCellStyle = dateCellStyle;}else if (cCol.ValueType.ToString() == typeof(decimal).ToString() || cCol.ValueType.ToString() == typeof(double).ToString()){cCol.DefaultCellStyle = amountCellStyle;}}if (hSize){dgv.RowHeadersWidth = dgv.RowHeadersWidth + ;}dgv.AutoResizeColumns();}//设置表格的行号static public void rowPostPaint_HeaderCount(object obj_sender, DataGridViewRowPostPaintEventArgs e){try{var sender = (DataGridView)obj_sender;//set rowheader countDataGridView grid = (DataGridView)sender;string rowIdx = System.Convert.ToString((e.RowIndex + ).ToString());var centerFormat = new StringFormat();centerFormat.Alignment = StringAlignment.Center;centerFormat.LineAlignment = StringAlignment.Center;Rectangle headerBounds = new Rectangle(e.RowBounds.Left, e.RowBounds.Top,grid.RowHeadersWidth, e.RowBounds.Height - sender.Rows[e.RowIndex].DividerHeight);e.Graphics.DrawString(rowIdx, grid.Font, SystemBrushes.ControlText,headerBounds, centerFormat);}catch (Exception ex){}}#endregion}/// <summary>/// 控件类型,是最外层的表格还是中间层的表格/// </summary>public enum controlType{outside = ,middle = }/// <summary>/// 展开图标/// </summary>public enum rowHeaderIcons{expand = ,collapse = }}
4、From页面调用
#region 使用方法一
//var oDataSet = GetDataSet();////masterDetail = new MasterControl(oDataSet, controlType.outside); #endregion
#region 使用方法二
var dicRelateData1 = new Dictionary<string, string>();var dicRelateData2 = new Dictionary<string, string>();dicRelateData1.Add("Menu_ID","Menu_ID");//表格一和表格二之间的主外键关系dicRelateData2.Add("Menu_Name2","Menu_Name2");//表格二和表格三之间的主外键关系 masterDetail = new MasterControl(GetDataSource(), GetDataSource2(), GetDataSource3(), dicRelateData1, dicRelateData2, controlType.outside); #endregion panelView.Controls.Add(masterDetail);
昨天应领导要求,折叠控件增加了折叠线的效果,看起来有没有更加像模像样了。~~~
其实就在行重绘事件private void MasterControl_RowPostPaint(object obj_sender, DataGridViewRowPostPaintEventArgs e)里面增加了如下代码:
using (Pen p = new Pen(Color.GhostWhite)){var iHalfWidth = (e.RowBounds.Left + sender.RowHeadersWidth) / 2;var oPointHLineStart = new Point(rect1.X + iHalfWidth, rect1.Y);var oPointHLineEnd = new Point(rect1.X + iHalfWidth, rect1.Y + rect1.Height / 2);e.Graphics.DrawLine(p, oPointHLineStart, oPointHLineEnd);//折叠线e.Graphics.DrawLine(p, oPointHLineEnd, new Point(oPointHLineEnd.X + iHalfWidth, oPointHLineEnd.Y));}
效果如下:
以上所述是小编给大家介绍的WinForm中DataGridView折叠控件的相关知识,希望对大家有所帮助!
新闻热点
疑难解答
图片精选