• DevExpress13.2.9 控件使用经验总结


    一.换肤功能

      1. 添加 DevExpress.OfficeSkins 和 DevExpress.BonusSkins 两个引用

      2. 皮肤注册

    DevExpress.UserSkins.BonusSkins.Register();
    DevExpress.Skins.SkinManager.EnableFormSkins();
    View Code

      3. 加载皮肤列表,调用 SkinTools.LoadSkinList 函数

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using psi.Common;
    using psi.Interfaces;
    using DevExpress.Skins;
    using DevExpress.LookAndFeel;
    
    /************************************************************************* 
     * 程序说明: 设置皮肤工具
     **************************************************************************/
    namespace psi.Library
    {
        /// <summary>
        /// 设置皮肤工具
        /// </summary>
        public class SkinTools
        {
            private static ToolStripMenuItem _CurrentSkinList = null;
    
            /// <summary>
            /// 加载皮肤列表
            /// </summary>
            public static void LoadSkinList(ToolStripMenuItem owner)
            {
                _CurrentSkinList = owner;
    
                int skinCount = DevExpress.Skins.SkinManager.Default.Skins.Count;
                ToolStripItem[] itemArr = new ToolStripItem[skinCount];
                int index = 0;
                foreach (DevExpress.Skins.SkinContainer skin in DevExpress.Skins.SkinManager.Default.Skins)
                {
                    ToolStripMenuItem item = new ToolStripMenuItem();
                    item.Text = skin.SkinName;
                    item.Name = skin.SkinName;
                    item.Checked = skin.SkinName == SystemConfig.CurrentConfig.SkinName;
                    item.Click += new System.EventHandler(OnSetSkinClick);
                    itemArr[index] = item;
                    ++index;
                }
    
                owner.DropDownItems.AddRange(itemArr);
            }
    
            /// <summary>
            /// 设置皮肤
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private static void OnSetSkinClick(object sender, EventArgs e)
            {
                ToolStripMenuItem clickItem = sender as ToolStripMenuItem;
                SetSkin(clickItem.Name);
    
                if (_CurrentSkinList != null)
                {
                    foreach (ToolStripMenuItem item in _CurrentSkinList.DropDownItems)
                    {
                        item.Checked = false;
                    }
                }
    
                clickItem.Checked = true;
            }
    
            public static void SetSkin(string skinName)
            {
                //设置所有窗体的皮肤
                for (int i = 0; i < Application.OpenForms.Count - 1; i++)
                {
                    Form form = Application.OpenForms[i];
    
                    if (form is IFormBase) (form as IFormBase).SetSkin(skinName);
                }
            }
        }
    }
    View Code

      4. 效果如下图

    二. Grid 显示行号以及设置行号列名称

      1. 添加 GridView 方法 CustomDrawRowIndicator

    /// <summary>
    /// 显示行号和设置行号列头部的字符
    /// </summary>
    private void gvSummary_CustomDrawRowIndicator(object sender, DevExpress.XtraGrid.Views.Grid.RowIndicatorCustomDrawEventArgs e)
    {
        if (e.Info.Kind == DevExpress.Utils.Drawing.IndicatorKind.Header)
        {
            e.Info.DisplayText = "行号";
        }
        e.Appearance.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
        if (e.Info.IsRowIndicator && e.RowHandle >= 0)
        {
            e.Info.DisplayText = Convert.ToString(e.RowHandle + 1);
        }
    }
    View Code

      2. 效果如下图

    三. Grid 下添加固定合计行

      1. 继承 GridView ,自定义表格 GridViewSummary,改变Grid父级控制器

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Diagnostics;
    using System.Linq;
    using System.Text;
    using DevExpress.XtraGrid.Views.Grid;
    using DevExpress.XtraGrid.Columns;
    using System.Windows.Forms;
    using DevExpress.Skins;
    using DevExpress.LookAndFeel;
    using System.Drawing;
    using DevExpress.XtraGrid;
    using System.Collections;
    
    namespace psi.UserControls.SummaryDataGrid
    {
        public partial class GridViewSummary : GridView
        {
            #region Browsable properties
    
            /// <summary>
            /// 是否显示合计行的头部
            /// </summary>
            private bool displaySumRowHeader;
            [Browsable(true), Category("Summary")]
            public bool DisplaySumRowHeader
            {
                get { return displaySumRowHeader; }
                set { displaySumRowHeader = value; }
            }
    
            /// <summary>
            /// 合计行头部文本
            /// </summary>
            private string sumRowHeaderText;
            [Browsable(true), Category("Summary")]
            public string SumRowHeaderText
            {
                get { return sumRowHeaderText; }
                set { sumRowHeaderText = value; }
            }
    
            /// <summary>
            /// 合计行头部是否加粗
            /// </summary>
            private bool sumRowHeaderTextBold;
            [Browsable(true), Category("Summary")]
            public bool SumRowHeaderTextBold
            {
                get { return sumRowHeaderTextBold; }
                set { sumRowHeaderTextBold = value; }
            }
    
            /// <summary>
            /// 需要合计列的列名数组
            /// </summary>
            private string[] summaryColumns;
            [Browsable(true), Category("Summary")]
            public string[] SummaryColumns
            {
                get { return summaryColumns; }
                set { summaryColumns = value; }
            }
    
            /// <summary>
            /// 合并的列的集合
            /// </summary>
            private List<MergeColumn> mergeColumns = new List<MergeColumn>();
            [Browsable(true), Category("Summary")]
            [TypeConverter(typeof(System.ComponentModel.CollectionConverter))]       
            [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
            public List<MergeColumn> MergeColumns
            {
                get { return mergeColumns; }
            }
            #endregion
    
            #region Declare variables
    
            private SummaryControlContainer summaryControl;
            private Panel parentPanel;
    
            public SummaryControlContainer SummaryControl
            {
                get{return this.summaryControl;}
            }
            #endregion
    
            #region Constructor
    
            public GridViewSummary()
            {
                InitializeComponent();
    
                this.parentPanel = new Panel();
                summaryControl = new SummaryControlContainer(this);
            }
    
            #endregion
    
            /// <summary>
            /// 改变合计列的皮肤样式,使适应DevExpress的皮肤
            /// </summary>
            private void ChangeSummarySkin()
            {
                if (!DesignMode && this.summaryControl != null)
                {
                    //Skin CommonSkin = CommonSkins.GetSkin(UserLookAndFeel.Default.ActiveLookAndFeel);
                    Skin GridSkin = GridSkins.GetSkin(UserLookAndFeel.Default.ActiveLookAndFeel);
                    this.summaryControl.BackColor = GridSkin[GridSkins.SkinGridEvenRow].Color.BackColor;
                }
            }
    
            /// <summary>
            /// 改变Grid所属的父级控件
            /// </summary>
            private void ChangeParent()
            {
                Control parent = this.GridControl.Parent;
                if (!DesignMode && parent != null)
                {
                    gridOldWidth = GridControl.Width;
    
                    summaryControl.InitialHeight = this.RowHeight + 2;
                    summaryControl.ForeColor = Color.Transparent;
                    summaryControl.Height = summaryControl.InitialHeight;
    
                    this.parentPanel.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
                    this.parentPanel.Dock = DockStyle.Top;
                    Size panelSize = new Size();
                    panelSize.Height = this.GridControl.Height + summaryControl.InitialHeight;
                    this.parentPanel.Size = panelSize;
    
                    summaryControl.Dock = DockStyle.Bottom;
    
                    int controlIdx = parent.Controls.GetChildIndex(this.GridControl);
                    parent.Controls.Remove(this.GridControl);
    
                    this.GridControl.Location = new Point(0, 0);
                    this.GridControl.SizeChanged += delegate(object sender, EventArgs e)
                    {
                        GridControl obj = (GridControl)sender;
                        if (obj.Width != gridOldWidth)
                        {
                            AdjustColumnWidth();
                            summaryControl.resizeSumBoxes();
                            gridOldWidth = obj.Width;
                        }
                    };
    
                    this.parentPanel.Controls.Add(this.GridControl);
                    this.parentPanel.Controls.Add(summaryControl);
                    this.parentPanel.SizeChanged += delegate(object sender, EventArgs e)
                    {
                        if (Program.HomeForm.WindowState != FormWindowState.Minimized)
                        {
                            Panel obj = (Panel)sender;
                            if (obj.Width != 0 && obj.Width != GridControl.Width)
                            {
                                gridOldWidth = GridControl.Width;
                                GridControl.Width = obj.Width;
                            }
                        }
                    };
                    parent.Controls.Add(parentPanel);
                    parent.Controls.SetChildIndex(parentPanel, controlIdx);
                }
            }
    
            /// <summary>
            /// 取得所有显示的列
            /// </summary>
            public List<GridColumn> DisaplyColumns
            {
                get
                {
                    List<GridColumn> result = new List<GridColumn>();
                    GridColumnCollection columns = this.Columns;
                    if (columns == null)
                        return result;
                    foreach (GridColumn column in columns)
                    {
                        if (column.Visible)
                            result.Add(column);
                    }
    
                    return result;
                }
            }
    
            public delegate void BeforeEndInitHandler();
            public event BeforeEndInitHandler BeforeEndInit;   
    
            public override void EndInit()
            {
                if (BeforeEndInit != null) BeforeEndInit();
                ChangeSummarySkin();
                ChangeParent();
                summaryControl.reCreateSumBoxes();
            }
    
            protected override void OnLookAndFeelChanged()
            {
                base.OnLookAndFeelChanged();
    
                ChangeSummarySkin();
                summaryControl.reCreateSumBoxes();
            }
    
            private int gridOldWidth;
    
            /// 手动处理列宽度
            public delegate void HandlerColumnWidth(GridColumn column, int maxWidth);
            public event HandlerColumnWidth ColumnWidthHandler;
    
            /// 不进行宽度调整的列
            public delegate List<GridColumn> ExcludeAdjustWidthColumns();
            public event ExcludeAdjustWidthColumns ExcludeAdjustColumns;
    
            /// <summary>
            /// 调整列宽度
            /// </summary>
            public void AdjustColumnWidth()
            {
                Control parent = this.GridControl.Parent;
                if (!DesignMode && parent != null)
                {
                    int gridWidth = this.GridControl.Width;
                    int columnsWidth = this.IndicatorWidth + 18;
                    int count = 0;
                    foreach (GridColumn column in DisaplyColumns)
                    {
                        if (ExcludeAdjustColumns != null)
                        {
                            List<GridColumn> excludeColumns = ExcludeAdjustColumns();
                            if (excludeColumns != null && excludeColumns.Contains(column))
                            {
                                continue;
                            }
                        }
                        count++;
                        column.Width = (column.Width * gridWidth) / gridOldWidth;
                        if (ColumnWidthHandler != null) ColumnWidthHandler(column, gridWidth - columnsWidth);
    
                        columnsWidth += column.Width;                 
                    }
                }   
            }
    
            /// <summary>
            /// 删除全部行
            /// </summary>
            public void ClearRows()
            {
                bool _mutilSelected = this.OptionsSelection.MultiSelect;//获取当前是否可以多选
                if (!_mutilSelected)
                    this.OptionsSelection.MultiSelect = true;
                this.SelectAll();
                this.DeleteSelectedRows();
                this.OptionsSelection.MultiSelect = _mutilSelected;//还原之前是否可以多选状态
            }
        }
    }
    View Code

      2. GridViewSummary 所属的父级控制器,创建合计行

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Diagnostics;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Collections;
    using DevExpress.XtraGrid;
    using System.Drawing;
    using DevExpress.XtraGrid.Views.Grid;
    using DevExpress.XtraGrid.Views.Base;
    using DevExpress.XtraGrid.Columns;
    using DevExpress.Skins;
    using DevExpress.LookAndFeel;
    using System.Data;
    
    namespace psi.UserControls.SummaryDataGrid
    {
        public class SummaryControlContainer : UserControl
        {
            #region Declare variables
            private Hashtable sumBoxHash;
            private GridViewSummary gridViewSummary;
            private Label sumRowHeaderLabel;
    
            private int initialHeight;
            public int InitialHeight
            {
                get { return initialHeight; }
                set { initialHeight = value; }
            }
    
            public Hashtable SumBoxHash
            {
                get { return this.sumBoxHash; }
            }
    
            #endregion
    
            #region Constructors
    
            public SummaryControlContainer(GridViewSummary gridViewSummary)
            {
                if (gridViewSummary == null)
                    throw new Exception("GridViewSummary is null!");
    
                this.gridViewSummary = gridViewSummary;
                sumBoxHash = new Hashtable();
                sumRowHeaderLabel = new Label();
            }
    
            #endregion
    
            #region Functions
    
            /// <summary>
            /// Checks if passed object is of type of integer
            /// </summary>
            /// <param name="o">object</param>
            /// <returns>true/ false</returns>
            protected bool IsInteger(object o)
            {
                if (o is Int64)
                    return true;
                if (o is Int32)
                    return true;
                if (o is Int16)
                    return true;
                return false;
            }
    
            /// <summary>
            /// Checks if passed object is of type of decimal/ double
            /// </summary>
            /// <param name="o">object</param>
            /// <returns>true/ false</returns>
            protected bool IsDecimal(object o)
            {
                if (o is Decimal)
                    return true;
                if (o is Single)
                    return true;
                if (o is Double)
                    return true;
                return false;
            }
    
            /// <summary>
            /// Create summary boxes for each Column of the DataGridView        
            /// </summary>
            public void reCreateSumBoxes()
            {
                ReadOnlyTextBox sumBox;
                Skin GridSkin = GridSkins.GetSkin(UserLookAndFeel.Default.ActiveLookAndFeel);
                Skin CommonSkin = CommonSkins.GetSkin(UserLookAndFeel.Default.ActiveLookAndFeel);
                
                foreach (Control control in sumBoxHash.Values)
                {
                    this.Controls.Remove(control);
                }
    
                int iCnt = 0;
    
                List<GridColumn> gridColumns = this.gridViewSummary.DisaplyColumns;
                foreach (GridColumn gridColumn in gridColumns)
                {
                    sumBox = new ReadOnlyTextBox();
                    sumBox.Top = 0;
                    sumBox.Height = this.initialHeight;
                    sumBox.BorderColor = GridSkin[GridSkins.SkinGridLine].Color.BackColor;
                    sumBox.Font = this.gridViewSummary.GridControl.Font;
                    sumBox.ForeColor = this.gridViewSummary.GridControl.ForeColor;
                    iCnt++;
    
                    bool isMergeColumn = false;
                    foreach (MergeColumn mergeColumn in this.gridViewSummary.MergeColumns)
                    {
                        if (gridColumn.VisibleIndex >= mergeColumn.StartIndex && gridColumn.VisibleIndex <= mergeColumn.EndIndex)
                        {
                            isMergeColumn = true;
                            
                            if (gridColumn.VisibleIndex == mergeColumn.StartIndex)
                            {
                                if (gridColumns.Count == iCnt + (mergeColumn.EndIndex - mergeColumn.StartIndex + 1))
                                {
                                    sumBox.IsLastColumn = true;
                                }
                                if (sumBoxHash.ContainsKey(mergeColumn.ColumnName))
                                {
                                    ReadOnlyTextBox textBox = (ReadOnlyTextBox)sumBoxHash[mergeColumn.ColumnName];
                                    sumBox.Text = textBox.Text;
                                    sumBoxHash.Remove(mergeColumn.ColumnName);
                                }
                                sumBoxHash.Add(mergeColumn.ColumnName, sumBox);
                                this.Controls.Add(sumBox);
                            }
                            break;
                        }
                    }
                    if (isMergeColumn)
                        continue;
    
    
                    if (gridColumns.Count == iCnt)
                        sumBox.IsLastColumn = true;
    
                    if(sumBoxHash.ContainsKey(gridColumn.Name))
                    {
                        ReadOnlyTextBox textBox = (ReadOnlyTextBox)sumBoxHash[gridColumn.Name];
                        sumBox.Text = textBox.Text;
                        sumBoxHash.Remove(gridColumn.Name);
                    }
                    sumBoxHash.Add(gridColumn.Name, sumBox);
    
                    if (gridViewSummary.SummaryColumns != null && gridViewSummary.SummaryColumns.Length > 0)
                    {
                        for (int iCntX = 0; iCntX < gridViewSummary.SummaryColumns.Length; iCntX++)
                        {
                            if (gridViewSummary.SummaryColumns[iCntX] == gridColumn.Name)
                            {
                                sumBox.TextAlign = TextHelper.TranslateGridColumnAligment(gridColumn.AppearanceCell.TextOptions.HAlignment);
                                sumBox.IsSummary = true;
    
                                sumBox.FormatString = gridColumn.DisplayFormat.FormatString;
                                if (gridColumn.ColumnType == typeof(System.Int32) || gridColumn.ColumnType == typeof(System.Int16) ||
                                    gridColumn.ColumnType == typeof(System.Int64) || gridColumn.ColumnType == typeof(System.Single) ||
                                    gridColumn.ColumnType == typeof(System.Double) || gridColumn.ColumnType == typeof(System.Single) ||
                                    gridColumn.ColumnType == typeof(System.Decimal))
                                    sumBox.Tag = System.Activator.CreateInstance(gridColumn.ColumnType);
    
                                break;
                            }
                        }
                    }
    
                    this.Controls.Add(sumBox);
                }
    
                if (gridViewSummary.DisplaySumRowHeader)
                {
                    sumRowHeaderLabel.Width = this.gridViewSummary.IndicatorWidth;
                    sumRowHeaderLabel.Font = new Font(this.gridViewSummary.GridControl.Font, this.gridViewSummary.SumRowHeaderTextBold ? FontStyle.Bold : FontStyle.Regular);
                    sumRowHeaderLabel.Anchor = AnchorStyles.Left;
                    sumRowHeaderLabel.TextAlign = ContentAlignment.MiddleCenter;
                    sumRowHeaderLabel.Height = sumRowHeaderLabel.Font.Height;
                    sumRowHeaderLabel.Top = Convert.ToInt32(Convert.ToDouble(this.InitialHeight - sumRowHeaderLabel.Height) / 2F);
                    sumRowHeaderLabel.Text = gridViewSummary.SumRowHeaderText;
    
                    sumRowHeaderLabel.ForeColor = this.gridViewSummary.GridControl.ForeColor;
                    sumRowHeaderLabel.Margin = new Padding(0);
                    sumRowHeaderLabel.Padding = new Padding(0);
    
                    this.Controls.Add(sumRowHeaderLabel);
                }
                resizeSumBoxes();
            }
    
             /// <summary>
            /// Resize the text Boxes depending on the 
            /// width of the Columns of the GridView
            /// </summary>
            public void resizeSumBoxes()
            {
                this.SuspendLayout();
                if (sumBoxHash.Count > 0)
                    try
                    {
                        int rowHeaderWidth = gridViewSummary.OptionsView.ShowIndicator ? gridViewSummary.IndicatorWidth - 1: 0;
                        int curPos = rowHeaderWidth;
    
                        if (gridViewSummary.DisplaySumRowHeader && rowHeaderWidth > 0)
                        {
                            sumRowHeaderLabel.Dock = DockStyle.Left;
                        }
                        else
                        {
                            if (sumRowHeaderLabel.Visible)
                                sumRowHeaderLabel.Visible = false;
                        }
    
                        Rectangle oldBounds;
                        List<GridColumn> gridColumns = this.gridViewSummary.DisaplyColumns;
                        int mergeColumnWidth = 0;
                        foreach (GridColumn gridColumn in gridColumns)
                        {
                            ReadOnlyTextBox sumBox = null;
    
                            bool isMergeColumn = false;
                            foreach (MergeColumn mergeColumn in this.gridViewSummary.MergeColumns)
                            {
                                if (gridColumn.VisibleIndex >= mergeColumn.StartIndex && gridColumn.VisibleIndex <= mergeColumn.EndIndex)
                                {
                                    isMergeColumn = true;
                                    mergeColumnWidth += gridColumn.Width;
                                    if (gridColumn.VisibleIndex == mergeColumn.EndIndex)
                                    {
                                        sumBox = (ReadOnlyTextBox)sumBoxHash[mergeColumn.ColumnName];
                                        if (sumBox != null)
                                        {
                                            oldBounds = sumBox.Bounds;
    
                                            sumBox.SetBounds(curPos, 0, mergeColumnWidth, 0, BoundsSpecified.X | BoundsSpecified.Width);
    
                                            if (!sumBox.Visible)
                                                sumBox.Visible = true;
    
                                            if (oldBounds != sumBox.Bounds)
                                                sumBox.Invalidate();
    
                                            curPos += mergeColumnWidth;
                                            mergeColumnWidth = 0;
                                        }
                                    }
                                }
                            }
                            if (isMergeColumn)
                                continue;
    
                            sumBox = (ReadOnlyTextBox)sumBoxHash[gridColumn.Name];
                            if (sumBox != null)
                            {
                                oldBounds = sumBox.Bounds;
    
                                sumBox.SetBounds(curPos, 0, gridColumn.Width, 0, BoundsSpecified.X | BoundsSpecified.Width);
    
                                if (!sumBox.Visible)
                                    sumBox.Visible = true;
    
                                if (oldBounds != sumBox.Bounds)
                                    sumBox.Invalidate();
    
                                curPos += gridColumn.Width;
                            }
                        }
                    }
                    finally
                    {
                        this.ResumeLayout();
                    }
            }
            #endregion
        }
    }
    View Code

      3. 合计行的单元格对象

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Drawing;
    using System.Data;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Text.RegularExpressions;
    using psi.Common;
    
    namespace psi.UserControls.SummaryDataGrid
    {
        public partial class ReadOnlyTextBox : UserControl
        {
    
            StringFormat format;
            public event EventHandler TextChanged;
    
            public ReadOnlyTextBox()
            {
                InitializeComponent();
    
                format = new StringFormat(StringFormatFlags.NoWrap | StringFormatFlags.FitBlackBox | StringFormatFlags.MeasureTrailingSpaces);
                format.LineAlignment = StringAlignment.Center;
    
                this.Height = 10;
                this.Width = 10;
    
                this.Padding = new Padding(2);
            }
    
            private Color borderColor = Color.Black;
    
            private bool isSummary;
            public bool IsSummary
            {
                get { return isSummary; }
                set { isSummary = value; }
            }
    
            private bool isLastColumn;
            public bool IsLastColumn
            {
                get { return isLastColumn; }
                set { isLastColumn = value; }
            }
    
            private string formatString;
            public string FormatString
            {
                get { return formatString; }
                set { formatString = value; }
            }
    
    
            private HorizontalAlignment textAlign = HorizontalAlignment.Left;
            [DefaultValue(HorizontalAlignment.Left)]
            public HorizontalAlignment TextAlign
            {
                get { return textAlign; }
                set
                {
                    textAlign = value;
                    setFormatFlags();
                }
            }
    
            private StringTrimming trimming = StringTrimming.None;
            [DefaultValue(StringTrimming.None)]
            public StringTrimming Trimming
            {
                get { return trimming; }
                set
                {
                    trimming = value;
                    setFormatFlags();
                }
            }
    
            private void setFormatFlags()
            {
                format.Alignment = TextHelper.TranslateAligment(TextAlign);
                format.Trimming = trimming;
            }
    
            public Color BorderColor
            {
                get { return borderColor; }
                set { borderColor = value; }
            }
    
            protected override void OnPaint(PaintEventArgs e)
            {
                int subWidth = 0;
                Rectangle textBounds;
    
                if (!string.IsNullOrEmpty(formatString) && !string.IsNullOrEmpty(Text))
                {
                    decimal num = Convert.ToDecimal(ConvertEx.replaceCurrency(Text));
                    if (Text.Contains('%'))
                        num = decimal.Divide(num, 100);
                    Text = String.Format("{0:" + formatString + "}", num);
                }
    
                textBounds = new Rectangle(this.ClientRectangle.X, this.ClientRectangle.Y, this.ClientRectangle.Width, this.ClientRectangle.Height);
                using (Pen pen = new Pen(borderColor))
                {
                    if (isLastColumn)
                        subWidth = 1;
    
                    e.Graphics.FillRectangle(new SolidBrush(this.BackColor), this.ClientRectangle);
                    e.Graphics.DrawRectangle(pen, this.ClientRectangle.X, this.ClientRectangle.Y, this.ClientRectangle.Width - subWidth, this.ClientRectangle.Height);
                    e.Graphics.DrawString(Text, Font, new SolidBrush(ForeColor), textBounds, format);
                }
            }
    
            protected override void OnTextChanged(EventArgs e)
            {
                base.OnTextChanged(e);
                if (TextChanged != null)
                    TextChanged(this, e);
            }
    
        }
    }
    View Code

      4. 使用自定义表格 GridViewSummary,效果如下

    四. Grid 自定义绘制操作列头

      1. 创建  修改列(operate_modify)、删除列(operate_del)

      2. 添加 GridView 方法  CustomDrawColumnHeader,绘制表头

    /// <summary>
    /// 自定义绘制操作列表头
    /// </summary>
    private void gvDetail_CustomDrawColumnHeader(object sender, DevExpress.XtraGrid.Views.Grid.ColumnHeaderCustomDrawEventArgs e)
    {
        if(e.Column != null)
        {
            if (e.Column == operate_modify)
            {
                e.Info.InnerElements.Clear();
                e.Painter.DrawObject(e.Info);
                e.Handled = true;
    
                int delColumnWidth = operate_del.VisibleWidth;
                e.Graphics.FillRectangle(new SolidBrush(e.Info.Appearance.BackColor), new Rectangle(e.Bounds.X - delColumnWidth + 1, e.Bounds.Y + 1, e.Bounds.Width + delColumnWidth - 2, e.Bounds.Height - 2));
                e.Graphics.DrawString("操作", new Font("宋体", 9f), new SolidBrush(e.Info.Appearance.ForeColor), new Rectangle((e.Bounds.X - delColumnWidth) + (e.Bounds.Width + delColumnWidth) / 2 - 15, e.Bounds.Y + 8, 30, 15));
            }        
        }
    }
    View Code

      3. 效果如下

    五. Grid 绘制复选框和全选框

      1. 创建  复选框列(check)

      2. 添加 GridView 方法 CustomDrawCell,绘制复选框

    /// <summary>
    /// 自定义绘制删除、修改单元格
    /// </summary>
    private void gvDetail_CustomDrawCell(object sender, DevExpress.XtraGrid.Views.Base.RowCellCustomDrawEventArgs e)
    {
        GridView currentView = sender as GridView;
        if (e.Column == check)
        {
            ControlPaint.DrawCheckBox(e.Graphics, new Rectangle(e.Bounds.X + e.Bounds.Width / 2 - 8, e.Bounds.Y + 3, 16, 16), checkBoxState[e.RowHandle]);
        }        
    }
    View Code

      3. 添加 GridView 方法 CustomDrawColumnHeader,绘制全选框

    /// <summary>
    /// 自定义绘制操作列表头
    /// </summary>
    private void gvDetail_CustomDrawColumnHeader(object sender, DevExpress.XtraGrid.Views.Grid.ColumnHeaderCustomDrawEventArgs e)
    {
        if(e.Column != null)
        {
            if (e.Column == check)
            {
                e.Info.InnerElements.Clear();
                e.Painter.DrawObject(e.Info);
                e.Handled = true;
    
                ControlPaint.DrawCheckBox(e.Graphics, new Rectangle(e.Bounds.X + e.Bounds.Width / 2 - 8, e.Bounds.Y + 6, 16, 16), allSelectState);
            }
        }
    }
    View Code

      4. 添加 GridView 方法 Click ,判断全选框是否被点击,若有则重绘所有复选框

    /// <summary>
    /// 判断Grid全选框是否被单击
    /// </summary>
    /// <param name="gridView"></param>
    /// <param name="name"></param>
    /// <returns></returns>
    public bool ClickGridCheckBox(DevExpress.XtraGrid.Views.Grid.GridView gridView, string name)
    {
        bool result = false;
        if (gridView != null)
        {
            DevExpress.XtraGrid.Views.Grid.ViewInfo.GridHitInfo info;
            Point pt = gridView.GridControl.PointToClient(Control.MousePosition);
            info = gridView.CalcHitInfo(pt);
            if (info.InColumn && info.Column != null && info.Column.Name == name)
            {
                return true;
            }
        }
        return result;
    } 
    
    
    private void gvDetail_Click(object sender, EventArgs e)
    {
        if (ClickGridCheckBox(this.gvDetail, "check"))
        {
            allSelectState = allSelectState == ButtonState.Checked ? ButtonState.Normal : ButtonState.Checked;
            selCount = allSelectState == ButtonState.Checked?0:checkBoxState.Count;
            
            for (int i = 0; i < checkBoxState.Count; i++)
            {
                SetCheckBoxState(i, allSelectState);
            }
        }
    }
    
    /// <summary>
    /// 重新绘制复选框
    /// </summary>
    /// <param name="rowHandle"></param>
    /// <param name="state"></param>
    private void SetCheckBoxState(int rowHandle, ButtonState state)
    {
        checkBoxState[rowHandle] = state;
        //获取点击单元格左上角的坐标
        GridViewInfo info = gvDetail.GetViewInfo() as GridViewInfo;
        GridCellInfo cellInfo = info.GetGridCellInfo(rowHandle, check);
    
        ControlPaint.DrawCheckBox(gcDetail.CreateGraphics(), new Rectangle(cellInfo.Bounds.X + cellInfo.Bounds.Width / 2 - 8, cellInfo.Bounds.Y + 3, 16, 16), state);
    
    }
    View Code

      5. 效果如下

  • 相关阅读:
    命令模式
    装饰模式 decorator
    儒道佛
    Facade模式
    Adapter
    TListView ItemCheck CheckedItems
    观 徼 偶 感
    c# Mid 子窗体 盖住 控件
    pycharm 连接mysql时区问题
    django_drf
  • 原文地址:https://www.cnblogs.com/Mr-kevin/p/8270614.html
Copyright © 2020-2023  润新知