网站首页  汉语字词  英语词汇  考试资料  写作素材  旧版资料

请输入您要查询的范文:

 

标题 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 构造函数
    /// <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 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
    //设置构造函数的参数
    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集合转换成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>
    /// 折叠控件样式以及行数操作类
    /// </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折叠控件的相关知识,希望对大家有所帮助!
随便看

 

在线学习网范文大全提供好词好句、学习总结、工作总结、演讲稿等写作素材及范文模板,是学习及工作的有利工具。

 

Copyright © 2002-2024 cuapp.net All Rights Reserved
更新时间:2025/5/21 5:49:14