剛到一家新公司,領導下發任務要用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折疊控件的相關知識,希望對大家有所幫助!
新聞熱點
疑難解答
圖片精選