WinForm中DataGridView折疊控件

字號:


    下面小編把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 構造函數(shù)
    /// <summary>
    /// 通過傳遞過來的枚舉判斷是兩級還是三級展開,表的對應關系通過Relations來讀取
    /// 所以調用此構造函數(shù)的時候必須要講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的順序不能顛倒,必須先添加一、二級的表關聯(lián),再添加二、三級的表關聯(lián)
    /// </summary>
    /// <param name="cDataset">數(shù)據(jù)源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 數(shù)據(jù)綁定
    /// <summary>
    /// 設置表之間的主外鍵關聯(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 事件
    //控件的行頭點擊事件
    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 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 更改點開后背景色 劉金龍
    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 更改點開后背景色 劉金龍
    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ù)的參數(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得到表的關聯(liá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);
    }
    //.設置主外鍵對應關系
    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集合轉換成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);//設置主外鍵
    //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>
    /// 折疊控件樣式以及行數(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
    };
    //設置表格的主題樣式
    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 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>
    /// 展開圖標
    /// </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折疊控件的相關知識,希望對大家有所幫助!