WinForm中DataGridView折疊控件
來源:易賢網(wǎng) 閱讀:2874 次 日期:2016-08-09 14:22:58
溫馨提示:易賢網(wǎng)小編為您整理了“WinForm中DataGridView折疊控件”,方便廣大網(wǎng)友查閱!

下面小編把WinForm中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 構(gòu)造函數(shù)

/// <summary>

/// 通過傳遞過來的枚舉判斷是兩級還是三級展開,表的對應(yīng)關(guān)系通過Relations來讀取

/// 所以調(diào)用此構(gòu)造函數(shù)的時候必須要講Relations設(shè)置正確,才能正確顯示層級關(guān)系。

/// 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的順序不能顛倒,必須先添加一、二級的表關(guān)聯(lián),再添加二、三級的表關(guān)聯(lián)

/// </summary>

/// <param name="cDataset">數(shù)據(jù)源DataSet,里面還有各個表的對應(yīng)關(guān)系</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">第一二層之間對應(yīng)主外鍵</param>

/// <param name="dicRelateKey">第二三層之間對應(yīng)主外鍵</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 });

//這是對應(yīng)關(guān)系的時候主鍵必須唯一

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 數(shù)據(jù)綁定

/// <summary>

/// 設(shè)置表之間的主外鍵關(guān)聯(lián)

/// </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 事件

//控件的行頭點(diǎn)擊事件

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);

//設(shè)置一個最大高度

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 control

var rect = new Rectangle((int)(e.RowBounds.X + ((double)(rowDefaultHeight - ) / )), (int)(e.RowBounds.Y + ((double)(rowDefaultHeight - ) / )), , );

if (collapseRow)

{

if (this.rowCurrent.Contains(e.RowIndex))

{

#region 更改點(diǎn)開后背景色 劉金龍

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);

}

#endregion

sender.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 更改點(diǎn)開后背景色 劉金龍

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);

}

#endregion

sender.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

//設(shè)置構(gòu)造函數(shù)的參數(shù)

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得到表的關(guān)聯(lián)關(guān)系

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);

}

//.設(shè)置主外鍵對應(yīng)關(guān)系

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集合轉(zhuǎn)換成DataTable

private 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);//設(shè)置主外鍵

//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用來設(shè)置樣式

namespace Ewin.Client.Frame.UcGrid

{

/// <summary>

/// 折疊控件樣式以及行數(shù)操作類

/// </summary>

sealed class cModule

{

#region CustomGrid

static 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

};

//設(shè)置表格的主題樣式

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;

}

//設(shè)置表格單元格樣式

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();

}

//設(shè)置表格的行號

static public void rowPostPaint_HeaderCount(object obj_sender, DataGridViewRowPostPaintEventArgs e)

{

try

{

var sender = (DataGridView)obj_sender;

//set rowheader count

DataGridView 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>

/// 展開圖標(biāo)

/// </summary>

public enum rowHeaderIcons

{

expand = ,

collapse = 

}

}

4、From頁面調(diào)用

#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");//表格一和表格二之間的主外鍵關(guān)系

dicRelateData2.Add("Menu_Name2","Menu_Name2");//表格二和表格三之間的主外鍵關(guān)系 

masterDetail = new MasterControl(GetDataSource(), GetDataSource2(), GetDataSource3(), dicRelateData1, dicRelateData2, controlType.outside); #endregion panelView.Controls.Add(masterDetail);

昨天應(yīng)領(lǐng)導(dǎo)要求,折疊控件增加了折疊線的效果,看起來有沒有更加像模像樣了。~~~

其實(shí)就在行重繪事件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折疊控件的相關(guān)知識,希望對大家有所幫助!

更多信息請查看網(wǎng)絡(luò)編程
易賢網(wǎng)手機(jī)網(wǎng)站地址:WinForm中DataGridView折疊控件
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 加入群交流 | 手機(jī)站點(diǎn) | 投訴建議
工業(yè)和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網(wǎng)安備53010202001879號 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號
云南網(wǎng)警備案專用圖標(biāo)
聯(lián)系電話:0871-65317125(9:00—18:00) 獲取招聘考試信息及咨詢關(guān)注公眾號:hfpxwx
咨詢QQ:526150442(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報警專用圖標(biāo)