C# 自定義DataGridView列


1.定義

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Windows.Forms;
using System.Collections;
using DevComponents.DotNetBar.Controls;
using System.Data;

namespace Bn6.Common
{
    /// <summary>
    /// 自定義的DataGridView操作類
    /// </summary>
    public class DgvTools
    {
        #region 創建DataGridView的TextBox列
        /// <summary>
        /// 創建DataGridView的TextBox列
        /// </summary>
        /// <param name="_dgv">要創建列的DataGridView</param>
        /// <param name="_alignment">設置列的對齊方式</param>
        /// <param name="_columnName">列名</param>
        /// <param name="_headerText">標題名</param>
        /// <param name="_dataPropertyName">綁定數據源的字段名稱</param>
        /// <param name="_toolTipText">TipText提示</param>
        /// <param name="_maxInputLength">可輸入的最大長度</param>
        /// <param name="_readOnly">設置列是否只讀,true 只讀,false 讀寫</param>
        /// <param name="_visible">設置列是否可見,true 顯示,false 隱藏</param>
        /// <param name="_notEmpty">設置列是否為必填列,true 必填,false 非必填</param>
        /// <param name="_backColor">設置列的背景色,當_notEmpty為true時,此項為必需值,為false,此項可以為Color.Empty</param>
        /// <param name="_columnState">裝載DataGridView可寫可讀、只讀列的數據字典</param>
        public static void InitDgvTextBoxColumn(DataGridView _dgv,
            DataGridViewContentAlignment _alignment, string _columnName, string _headerText,
            string _dataPropertyName, string _toolTipText, int _maxInputLength, bool _readOnly, bool _visible,
            bool _notEmpty, Color _backColor, ref Dictionary<string, bool> _columnState)
        {
            DataGridViewTextBoxColumn textBoxCol = new DataGridViewTextBoxColumn();
            textBoxCol.HeaderCell.Style.Alignment = _alignment == 0 ? DataGridViewContentAlignment.MiddleLeft : _alignment;
            textBoxCol.Name = _columnName;
            textBoxCol.HeaderText = _headerText;
            textBoxCol.DataPropertyName = _dataPropertyName;
            textBoxCol.ToolTipText = _toolTipText;
            textBoxCol.MaxInputLength = _maxInputLength;
            textBoxCol.Visible = _visible;
            textBoxCol.ReadOnly = _readOnly;
            if (_notEmpty == true)
            {
                textBoxCol.DefaultCellStyle.BackColor = _backColor;
            }
            _columnState.Add(_columnName, _readOnly);
            _dgv.Columns.Add(textBoxCol);
        }
        #endregion

        #region 創建DataGridView的擴展的TextBoxDropDown列
        /// <summary>
        /// 創建DataGridView的擴展的TextBoxDropDown列
        /// </summary>
        /// <param name="_dgv">要創建列的DataGridView</param>
        /// <param name="_alignment">設置列的對齊方式</param>
        /// <param name="_columnName">列名</param>
        /// <param name="_headerText">標題名</param>
        /// <param name="_dataPropertyName">綁定數據源的字段名稱</param>
        /// <param name="_toolTipText">TipText提示</param>
        /// <param name="_maxInputLength">可輸入的最大長度</param>
        /// <param name="_readOnly">設置列是否只讀,true 只讀,false 讀寫</param>
        /// <param name="_visible">設置列是否可見,true 顯示,false 隱藏</param>
        /// <param name="_notEmpty">設置列是否為必填列,true 必填,false 非必填</param>
        /// <param name="_backColor">設置列的背景色,當_notEmpty為true時,此項為必需值,為false,此項可以為Color.Empty</param>
        /// <param name="_buttonCustomVisible">設置是否顯示可選擇按鈕,true 顯示,false 隱藏</param>
        /// <param name="_columnState">裝載DataGridView可寫可讀、只讀列的數據字典</param>
        public static void InitDgvTextBoxDropDownColumn(DataGridView _dgv,
            DataGridViewContentAlignment _alignment, string _columnName, string _headerText,
            string _dataPropertyName, string _toolTipText, int _maxInputLength, bool _readOnly, bool _visible,
            bool _notEmpty, Color _backColor, bool _buttonCustomVisible, ref Dictionary<string, bool> _columnState)
        {
            DataGridViewTextBoxDropDownColumn textBoxDropDownCol = new DataGridViewTextBoxDropDownColumn();
            textBoxDropDownCol.HeaderCell.Style.Alignment = _alignment == 0 ? DataGridViewContentAlignment.MiddleLeft : _alignment;
            textBoxDropDownCol.Name = _columnName;
            textBoxDropDownCol.HeaderText = _headerText;
            textBoxDropDownCol.DataPropertyName = _dataPropertyName;
            textBoxDropDownCol.ToolTipText = _toolTipText;
            textBoxDropDownCol.MaxInputLength = _maxInputLength;
            textBoxDropDownCol.Visible = _visible;
            textBoxDropDownCol.ReadOnly = _readOnly;
            if (_notEmpty == true)
            {
                textBoxDropDownCol.DefaultCellStyle.BackColor = _backColor;
            }
            textBoxDropDownCol.ButtonCustom.Visible = _buttonCustomVisible;
            //textBoxDropDownCol.ButtonCustom2.Visible = _buttonCustomVisible;
            //textBoxDropDownCol.ButtonClear.Visible = _buttonCustomVisible;
            //textBoxDropDownCol.ButtonDropDown.Visible = _buttonCustomVisible;
            _columnState.Add(_columnName, _readOnly);
            _dgv.Columns.Add(textBoxDropDownCol);
        }
        #endregion

        #region 創建DataGridView的Button列
        /// <summary>
        /// 創建DataGridView的Button列
        /// </summary>
        /// <param name="_dgv">要創建列的DataGridView</param>
        /// <param name="_alignment">設置列的對齊方式</param>
        /// <param name="_columnName">列名</param>
        /// <param name="_headerText">標題名</param>
        /// <param name="_dataPropertyName">綁定數據源的字段名稱</param>
        /// <param name="_toolTipText">TipText提示</param>
        /// <param name="_readOnly">設置列是否只讀,true 只讀,false 讀寫</param>
        /// <param name="_visible">設置列是否可見,true 顯示,false 隱藏</param>
        /// <param name="_notEmpty">設置列是否為必填列,true 必填,false 非必填</param>
        /// <param name="_backColor">設置列的背景色,當_notEmpty為true時,此項為必需值,為false,此項可以為Color.Empty</param>
        /// <param name="_columnState">裝載DataGridView可寫可讀、只讀列的數據字典</param>
        public static void InitDgvButtonColumn(DataGridView _dgv,
            DataGridViewContentAlignment _alignment, string _columnName, string _headerText,
            string _dataPropertyName, string _toolTipText, bool _readOnly, bool _visible, bool _notEmpty, 
            Color _backColor, ref Dictionary<string, bool> _columnState)
        {
            DataGridViewButtonColumn buttonCol = new DataGridViewButtonColumn();
            buttonCol.HeaderCell.Style.Alignment = _alignment == 0 ? DataGridViewContentAlignment.MiddleLeft : _alignment;
            buttonCol.Name = _columnName;
            buttonCol.HeaderText = _headerText;
            buttonCol.DataPropertyName = _dataPropertyName;
            buttonCol.ToolTipText = _toolTipText;
            buttonCol.Visible = _visible;
            buttonCol.ReadOnly = _readOnly;
            if (_notEmpty == true)
            {
                buttonCol.DefaultCellStyle.BackColor = _backColor;
            }
            _columnState.Add(_columnName, _readOnly);
            _dgv.Columns.Add(buttonCol);
        }
        #endregion

        #region 創建DataGridView的擴展的Button列
        /// <summary>
        /// 創建DataGridView的擴展的Button列
        /// </summary>
        /// <param name="_dgv">要創建列的DataGridView</param>
        /// <param name="_alignment">設置列的對齊方式</param>
        /// <param name="_columnName">列名</param>
        /// <param name="_headerText">標題名</param>
        /// <param name="_dataPropertyName">綁定數據源的字段名稱</param>
        /// <param name="_toolTipText">TipText提示</param>
        /// <param name="_readOnly">設置列是否只讀,true 只讀,false 讀寫</param>
        /// <param name="_visible">設置列是否可見,true 顯示,false 隱藏</param>
        /// <param name="_notEmpty">設置列是否為必填列,true 必填,false 非必填</param>
        /// <param name="_backColor">設置列的背景色,當_notEmpty為true時,此項為必需值,為false,此項可以為Color.Empty</param>
        /// <param name="_autoCheckOnClick">設置單擊時是否選擇相同內容的,true 是,false 否</param>
        /// <param name="_columnState">裝載DataGridView可寫可讀、只讀列的數據字典</param>
        public static void InitDgvButtonXColumn(DataGridView _dgv,
            DataGridViewContentAlignment _alignment, string _columnName, string _headerText,
            string _dataPropertyName, string _toolTipText, bool _readOnly, bool _visible, bool _notEmpty, Color _backColor,
            bool _autoCheckOnClick, ref Dictionary<string, bool> _columnState)
        {
            DataGridViewButtonXColumn buttonXCol = new DataGridViewButtonXColumn();
            buttonXCol.HeaderCell.Style.Alignment = _alignment == 0 ? DataGridViewContentAlignment.MiddleLeft : _alignment;
            buttonXCol.Name = _columnName;
            buttonXCol.HeaderText = _headerText;
            buttonXCol.DataPropertyName = _dataPropertyName;
            buttonXCol.ToolTipText = _toolTipText;
            buttonXCol.Visible = _visible;
            buttonXCol.ReadOnly = _readOnly;
            if (_notEmpty == true)
            {
                buttonXCol.DefaultCellStyle.BackColor = _backColor;
            }
            buttonXCol.AutoCheckOnClick = _autoCheckOnClick;
            _columnState.Add(_columnName, _readOnly);
            _dgv.Columns.Add(buttonXCol);
        }
        #endregion

        #region 創建DataGridView的CheckBox列
        /// <summary>
        /// 創建DataGridView的CheckBox列
        /// </summary>
        /// <param name="_dgv">要創建列的DataGridView</param>
        /// <param name="_alignment">設置列的對齊方式</param>
        /// <param name="_columnName">列名</param>
        /// <param name="_headerText">標題名</param>
        /// <param name="_dataPropertyName">綁定數據源的字段名稱</param>
        /// <param name="_toolTipText">TipText提示</param>
        /// <param name="_readOnly">設置列是否只讀,true 只讀,false 讀寫</param>
        /// <param name="_visible">設置列是否可見,true 顯示,false 隱藏</param>
        /// <param name="_notEmpty">設置列是否為必填列,true 必填,false 非必填</param>
        /// <param name="_backColor">設置列的背景色,當_notEmpty為true時,此項為必需值,為false,此項可以為Color.Empty</param>
        /// <param name="_columnState">裝載DataGridView可寫可讀、只讀列的數據字典</param>
        public static void InitDgvCheckBoxColumn(DataGridView _dgv,
            DataGridViewContentAlignment _alignment, string _columnName, string _headerText,
            string _dataPropertyName, string _toolTipText, bool _readOnly, bool _visible, bool _notEmpty, 
            Color _backColor, ref Dictionary<string, bool> _columnState)
        {
            DataGridViewCheckBoxColumn checkBoxCol = new DataGridViewCheckBoxColumn();
            checkBoxCol.HeaderCell.Style.Alignment = _alignment == 0 ? DataGridViewContentAlignment.MiddleLeft : _alignment;
            checkBoxCol.Name = _columnName;
            checkBoxCol.HeaderText = _headerText;
            checkBoxCol.DataPropertyName = _dataPropertyName;
            checkBoxCol.ToolTipText = _toolTipText;
            checkBoxCol.Visible = _visible;
            checkBoxCol.ReadOnly = _readOnly;
            if (_notEmpty == true)
            {
                checkBoxCol.DefaultCellStyle.BackColor = _backColor;
            }
            _columnState.Add(_columnName, _readOnly);
            _dgv.Columns.Add(checkBoxCol);
        }
        #endregion

        #region 創建DataGridView擴展的CheckBox列
        /// <summary>
        /// 創建DataGridView擴展的CheckBox列
        /// </summary>
        /// <param name="_dgv">要創建列的DataGridView</param>
        /// <param name="_alignment">設置列的對齊方式</param>
        /// <param name="_columnName">列名</param>
        /// <param name="_headerText">標題名</param>
        /// <param name="_dataPropertyName">綁定數據源的字段名稱</param>
        /// <param name="_toolTipText">TipText提示</param>
        /// <param name="_readOnly">設置列是否只讀,true 只讀,false 讀寫</param>
        /// <param name="_visible">設置列是否可見,true 顯示,false 隱藏</param>
        /// <param name="_notEmpty">設置列是否為必填列,true 必填,false 非必填</param>
        /// <param name="_backColor">設置列的背景色,當_notEmpty為true時,此項為必需值,為false,此項可以為Color.Empty</param>
        /// <param name="_columnState">裝載DataGridView可寫可讀、只讀列的數據字典</param>
        public static void InitDgvCheckBoxXColumn(DataGridView _dgv,
            DataGridViewContentAlignment _alignment, string _columnName, string _headerText,
            string _dataPropertyName, string _toolTipText, bool _readOnly, bool _visible, bool _notEmpty,
            Color _backColor, ref Dictionary<string, bool> _columnState)
        {
            DataGridViewCheckBoxXColumn checkBoxXCol = new DataGridViewCheckBoxXColumn();
            checkBoxXCol.HeaderCell.Style.Alignment = _alignment == 0 ? DataGridViewContentAlignment.MiddleLeft : _alignment;
            checkBoxXCol.Name = _columnName;
            checkBoxXCol.HeaderText = _headerText;
            checkBoxXCol.DataPropertyName = _dataPropertyName;
            checkBoxXCol.ToolTipText = _toolTipText;
            checkBoxXCol.Visible = _visible;
            checkBoxXCol.ReadOnly = _readOnly;
            if (_notEmpty == true)
            {
                checkBoxXCol.DefaultCellStyle.BackColor = _backColor;
            }
            _columnState.Add(_columnName, _readOnly);
            _dgv.Columns.Add(checkBoxXCol);
        }
        #endregion

        #region 創建DataGridView的ComboBox列
        /// <summary>
        /// 創建DataGridView的ComboBox列
        /// </summary>
        /// <param name="_dgv">要創建列的DataGridView</param>
        /// <param name="_alignment">設置列的對齊方式</param>
        /// <param name="_columnName">列名</param>
        /// <param name="_headerText">標題名</param>
        /// <param name="_dataPropertyName">綁定數據源的字段名稱</param>
        /// <param name="_toolTipText">TipText提示</param>
        /// <param name="_readOnly">設置列是否只讀,true 只讀,false 讀寫</param>
        /// <param name="_visible">設置列是否可見,true 顯示,false 隱藏</param>
        /// <param name="_cboDataSource">綁定ComboBox的數據源</param>
        /// <param name="_displayMember">用於顯示的字段名</param>
        /// <param name="_valueMember">綁定Value的字段名</param>
        /// <param name="_maxDropDownItems">設置顯示最大的下拉項條數</param>
        /// <param name="_cboDisplayStyle">設置顯示類型</param>
        /// <param name="_notEmpty">設置列是否為必填列,true 必填,false 非必填</param>
        /// <param name="_backColor">設置列的背景色,當_notEmpty為true時,此項為必需值,為false,此項可以為Color.Empty</param>
        /// <param name="_columnState">裝載DataGridView可寫可讀、只讀列的數據字典</param>
        public static void InitDgvComboBoxColumn(DataGridView _dgv,
            DataGridViewContentAlignment _alignment, string _columnName, string _headerText,
            string _dataPropertyName, string _toolTipText, bool _readOnly, bool _visible,
            DataTable _cboDataSource, string _displayMember, string _valueMember,
            int _maxDropDownItems, DataGridViewComboBoxDisplayStyle _cboDisplayStyle,
            bool _notEmpty, Color _backColor, ref Dictionary<string, bool> _columnState)
        {
            DataGridViewComboBoxColumn comboBoxCol = new DataGridViewComboBoxColumn();
            comboBoxCol.HeaderCell.Style.Alignment = _alignment == 0 ? DataGridViewContentAlignment.MiddleLeft : _alignment;
            comboBoxCol.Name = _columnName;
            comboBoxCol.HeaderText = _headerText;
            comboBoxCol.DataPropertyName = _dataPropertyName;
            comboBoxCol.ToolTipText = _toolTipText;
            comboBoxCol.Visible = _visible;
            comboBoxCol.ReadOnly = _readOnly;
            comboBoxCol.DataSource = _cboDataSource;
            comboBoxCol.DisplayMember = _displayMember;
            comboBoxCol.ValueMember = _valueMember;
            comboBoxCol.MaxDropDownItems = _maxDropDownItems;
            comboBoxCol.DisplayStyle = _cboDisplayStyle;
            comboBoxCol.AutoComplete = _cboDisplayStyle == DataGridViewComboBoxDisplayStyle.ComboBox ? true : false;
            if (_notEmpty == true)
            {
                comboBoxCol.DefaultCellStyle.BackColor = _backColor;
            }
            _columnState.Add(_columnName, _readOnly);
            _dgv.Columns.Add(comboBoxCol);
        }
        #endregion

        #region 創建DataGridView擴展的ComboBox列
        /// <summary>
        /// 創建DataGridView擴展的ComboBox列
        /// </summary>
        /// <param name="_dgv">要創建列的DataGridView</param>
        /// <param name="_alignment">設置列的對齊方式</param>
        /// <param name="_columnName">列名</param>
        /// <param name="_headerText">標題名</param>
        /// <param name="_dataPropertyName">綁定數據源的字段名稱</param>
        /// <param name="_toolTipText">TipText提示</param>
        /// <param name="_readOnly">設置列是否只讀,true 只讀,false 讀寫</param>
        /// <param name="_visible">設置列是否可見,true 顯示,false 隱藏</param>
        /// <param name="_cboDataSource">綁定ComboBox的數據源</param>
        /// <param name="_displayMember">用於顯示的字段名</param>
        /// <param name="_valueMember">綁定Value的字段名</param>
        /// <param name="_maxDropDownItems">設置顯示最大的下拉項條數</param>
        /// <param name="_dropDownStyle">設置顯示類型</param>
        /// <param name="_notEmpty">設置列是否為必填列,true 必填,false 非必填</param>
        /// <param name="_backColor">設置列的背景色,當_notEmpty為true時,此項為必需值,為false,此項可以為Color.Empty</param>
        /// <param name="_columnState">裝載DataGridView可寫可讀、只讀列的數據字典</param>
        public static void InitDgvComboBoxExColumn(DataGridView _dgv,
            DataGridViewContentAlignment _alignment, string _columnName, string _headerText,
            string _dataPropertyName, string _toolTipText, bool _readOnly, bool _visible,
            DataTable _cboDataSource, string _displayMember, string _valueMember,
            int _maxDropDownItems, ComboBoxStyle _dropDownStyle,
            bool _notEmpty, Color _backColor, ref Dictionary<string, bool> _columnState)
        {
            DataGridViewComboBoxExColumn comboBoxExCol = new DataGridViewComboBoxExColumn();
            comboBoxExCol.HeaderCell.Style.Alignment = _alignment == 0 ? DataGridViewContentAlignment.MiddleLeft : _alignment;
            comboBoxExCol.Name = _columnName;
            comboBoxExCol.HeaderText = _headerText;
            comboBoxExCol.DataPropertyName = _dataPropertyName;
            comboBoxExCol.ToolTipText = _toolTipText;
            comboBoxExCol.Visible = _visible;
            comboBoxExCol.ReadOnly = _readOnly;
            comboBoxExCol.DataSource = _cboDataSource;
            comboBoxExCol.DisplayMember = _displayMember;
            comboBoxExCol.ValueMember = _valueMember;
            comboBoxExCol.MaxDropDownItems = _maxDropDownItems;
            comboBoxExCol.DropDownStyle = _dropDownStyle;
            if (_notEmpty == true)
            {
                comboBoxExCol.DefaultCellStyle.BackColor = _backColor;
            }
            _columnState.Add(_columnName, _readOnly);
            _dgv.Columns.Add(comboBoxExCol);
        }
        #endregion

        #region 創建DataGridView擴展的DateTime列
        /// <summary>
        /// 創建DataGridView擴展的DateTime列
        /// </summary>
        /// <param name="_dgv">要創建列的DataGridView</param>
        /// <param name="_alignment">設置列的對齊方式</param>
        /// <param name="_columnName">列名</param>
        /// <param name="_headerText">標題名</param>
        /// <param name="_dataPropertyName">綁定數據源的字段名稱</param>
        /// <param name="_toolTipText">TipText提示</param>
        /// <param name="_format">設置日期格式</param>
        /// <param name="_defaultInputValues">設置當日起為空時,是否顯示默認日期,true 顯示,false 不顯示</param>
        /// <param name="_readOnly">設置列是否只讀,true 只讀,false 讀寫</param>
        /// <param name="_visible">設置列是否可見,true 顯示,false 隱藏</param>
        /// <param name="_notEmpty">設置列是否為必填列,true 必填,false 非必填</param>
        /// <param name="_backColor">設置列的背景色,當_notEmpty為true時,此項為必需值,為false,此項可以為Color.Empty</param>
        /// <param name="_columnState">裝載DataGridView可寫可讀、只讀列的數據字典</param>
        public static void InitDgvDateTimeColumn(DataGridView _dgv,
            DataGridViewContentAlignment _alignment, string _columnName, string _headerText,
            string _dataPropertyName, string _toolTipText,
            string _format, bool _defaultInputValues,
            bool _readOnly, bool _visible, bool _notEmpty, Color _backColor, ref Dictionary<string, bool> _columnState)
        {
            DataGridViewDateTimeInputColumn dateTimeCol = new DataGridViewDateTimeInputColumn();
            dateTimeCol.HeaderCell.Style.Alignment = _alignment == 0 ? DataGridViewContentAlignment.MiddleLeft : _alignment;
            dateTimeCol.Name = _columnName;
            dateTimeCol.HeaderText = _headerText;
            dateTimeCol.DataPropertyName = _dataPropertyName;
            dateTimeCol.ToolTipText = _toolTipText;
            dateTimeCol.AutoSelectDate = true;
            dateTimeCol.CustomFormat = _format;
            dateTimeCol.DefaultInputValues = _defaultInputValues;
            dateTimeCol.Visible = _visible;
            dateTimeCol.ReadOnly = _readOnly;
            if (_notEmpty == true)
            {
                dateTimeCol.DefaultCellStyle.BackColor = _backColor;
            }
            _columnState.Add(_columnName, _readOnly);
            _dgv.Columns.Add(dateTimeCol);
        }
        #endregion

        #region 創建DataGridView擴展的DoubleInput列
        /// <summary>
        /// 創建DataGridView擴展的DoubleInput列
        /// </summary>
        /// <param name="_dgv">要創建列的DataGridView</param>
        /// <param name="_alignment">設置列的對齊方式</param>
        /// <param name="_columnName">列名</param>
        /// <param name="_headerText">標題名</param>
        /// <param name="_dataPropertyName">綁定數據源的字段名稱</param>
        /// <param name="_toolTipText">TipText提示</param>
        /// <param name="_format">設置數字格式</param>
        /// <param name="_showUpDown">設置是否顯示上下調節按鈕,true 顯示,false 不顯示</param>
        /// <param name="_readOnly">設置列是否只讀,true 只讀,false 讀寫</param>
        /// <param name="_visible">設置列是否可見,true 顯示,false 隱藏</param>
        /// <param name="_notEmpty">設置列是否為必填列,true 必填,false 非必填</param>
        /// <param name="_backColor">設置列的背景色,當_notEmpty為true時,此項為必需值,為false,此項可以為Color.Empty</param>
        /// <param name="_columnState">裝載DataGridView可寫可讀、只讀列的數據字典</param>
        public static void InitDgvDoubleInputColumn(DataGridView _dgv,
            DataGridViewContentAlignment _alignment, string _columnName, string _headerText,
            string _dataPropertyName, string _toolTipText,
            string _format, bool _showUpDown,
            bool _readOnly, bool _visible, bool _notEmpty, Color _backColor, ref Dictionary<string, bool> _columnState)
        {
            DataGridViewDoubleInputColumn doubleInputCol = new DataGridViewDoubleInputColumn();
            doubleInputCol.HeaderCell.Style.Alignment = _alignment == 0 ? DataGridViewContentAlignment.MiddleLeft : _alignment;
            doubleInputCol.Name = _columnName;
            doubleInputCol.HeaderText = _headerText;
            doubleInputCol.DataPropertyName = _dataPropertyName;
            doubleInputCol.ToolTipText = _toolTipText;
            doubleInputCol.DisplayFormat = _format;
            doubleInputCol.ShowUpDown = _showUpDown;
            doubleInputCol.Visible = _visible;
            doubleInputCol.ReadOnly = _readOnly;
            doubleInputCol.InputHorizontalAlignment = DevComponents.Editors.eHorizontalAlignment.Right;
            if (_notEmpty == true)
            {
                doubleInputCol.DefaultCellStyle.BackColor = _backColor;
            }
            _columnState.Add(_columnName, _readOnly);
            _dgv.Columns.Add(doubleInputCol);
        }
        #endregion

        #region 創建DataGridView擴展的Image列
        /// <summary>
        /// 創建DataGridView擴展的Image列
        /// </summary>
        /// <param name="_dgv">要創建列的DataGridView</param>
        /// <param name="_alignment">設置列的對齊方式</param>
        /// <param name="_columnName">列名</param>
        /// <param name="_headerText">標題名</param>
        /// <param name="_dataPropertyName">綁定數據源的字段名稱</param>
        /// <param name="_toolTipText">TipText提示</param>
        /// <param name="_image">圖片</param>
        /// <param name="_layout">設置圖片布局方式</param>
        /// <param name="_readOnly">設置列是否只讀,true 只讀,false 讀寫</param>
        /// <param name="_visible">設置列是否可見,true 顯示,false 隱藏</param>
        /// <param name="_notEmpty">設置列是否為必填列,true 必填,false 非必填</param>
        /// <param name="_backColor">設置列的背景色,當_notEmpty為true時,此項為必需值,為false,此項可以為Color.Empty</param>
        /// <param name="_columnState">裝載DataGridView可寫可讀、只讀列的數據字典</param>
        public static void InitDgvImageColumn(DataGridView _dgv,
            DataGridViewContentAlignment _alignment, string _columnName, string _headerText,
            string _dataPropertyName, string _toolTipText,
            Image _image, DataGridViewImageCellLayout _layout,
            bool _readOnly, bool _visible, bool _notEmpty, Color _backColor, ref Dictionary<string, bool> _columnState)
        {
            DataGridViewImageColumn imageCol = new DataGridViewImageColumn();
            imageCol.HeaderCell.Style.Alignment = _alignment == 0 ? DataGridViewContentAlignment.MiddleLeft : _alignment;
            imageCol.Name = _columnName;
            imageCol.HeaderText = _headerText;
            imageCol.DataPropertyName = _dataPropertyName;
            imageCol.ToolTipText = _toolTipText;
            imageCol.Image = _image;
            imageCol.ImageLayout = _layout;
            imageCol.Visible = _visible;
            imageCol.ReadOnly = _readOnly;
            if (_notEmpty == true)
            {
                imageCol.DefaultCellStyle.BackColor = _backColor;
            }
            _columnState.Add(_columnName, _readOnly);
            _dgv.Columns.Add(imageCol);
        }
        #endregion

        #region 創建DataGridView擴展的IntegerInput列
        /// <summary>
        /// 創建DataGridView擴展的IntegerInput列
        /// </summary>
        /// <param name="_dgv">要創建列的DataGridView</param>
        /// <param name="_alignment">設置列的對齊方式</param>
        /// <param name="_columnName">列名</param>
        /// <param name="_headerText">標題名</param>
        /// <param name="_dataPropertyName">綁定數據源的字段名稱</param>
        /// <param name="_toolTipText">TipText提示</param>
        /// <param name="_showUpDown">設置列是否顯示上下可調節按鈕,true 顯示,false 隱藏</param>
        /// <param name="_readOnly">設置列是否只讀,true 只讀,false 讀寫</param>
        /// <param name="_visible">設置列是否可見,true 顯示,false 隱藏</param>
        /// <param name="_notEmpty">設置列是否為必填列,true 必填,false 非必填</param>
        /// <param name="_backColor">設置列的背景色,當_notEmpty為true時,此項為必需值,為false,此項可以為Color.Empty</param>
        /// <param name="_columnState">裝載DataGridView可寫可讀、只讀列的數據字典</param>
        public static void InitDgvIntegerInputColumn(DataGridView _dgv,
           DataGridViewContentAlignment _alignment, string _columnName, string _headerText,
           string _dataPropertyName, string _toolTipText, bool _showUpDown,
           bool _readOnly, bool _visible, bool _notEmpty, Color _backColor, ref Dictionary<string, bool> _columnState)
        {
            DataGridViewIntegerInputColumn integerInputCol = new DataGridViewIntegerInputColumn();
            integerInputCol.HeaderCell.Style.Alignment = _alignment == 0 ? DataGridViewContentAlignment.MiddleLeft : _alignment;
            integerInputCol.Name = _columnName;
            integerInputCol.HeaderText = _headerText;
            integerInputCol.DataPropertyName = _dataPropertyName;
            integerInputCol.ToolTipText = _toolTipText;
            integerInputCol.ShowUpDown = _showUpDown;
            integerInputCol.Visible = _visible;
            integerInputCol.ReadOnly = _readOnly;
            integerInputCol.InputHorizontalAlignment = DevComponents.Editors.eHorizontalAlignment.Right;
            if (_notEmpty == true)
            {
                integerInputCol.DefaultCellStyle.BackColor = _backColor;
            }
            _columnState.Add(_columnName, _readOnly);
            _dgv.Columns.Add(integerInputCol);
        }
        #endregion

        #region 創建DataGridView擴展的IpAddressInput列
        /// <summary>
        /// 創建DataGridView擴展的IpAddressInput列
        /// </summary>
        /// <param name="_dgv">要創建列的DataGridView</param>
        /// <param name="_alignment">設置列的對齊方式</param>
        /// <param name="_columnName">列名</param>
        /// <param name="_headerText">標題名</param>
        /// <param name="_dataPropertyName">綁定數據源的字段名稱</param>
        /// <param name="_toolTipText">TipText提示</param>
        /// <param name="_readOnly">設置列是否只讀,true 只讀,false 讀寫</param>
        /// <param name="_visible">設置列是否可見,true 顯示,false 隱藏</param>
        /// <param name="_notEmpty">設置列是否為必填列,true 必填,false 非必填</param>
        /// <param name="_backColor">設置列的背景色,當_notEmpty為true時,此項為必需值,為false,此項可以為Color.Empty</param>
        /// <param name="_columnState">裝載DataGridView可寫可讀、只讀列的數據字典</param>
        public static void InitDgvIpAddressInputColumn(DataGridView _dgv,
          DataGridViewContentAlignment _alignment, string _columnName, string _headerText,
          string _dataPropertyName, string _toolTipText,
          bool _readOnly, bool _visible, bool _notEmpty, Color _backColor, ref Dictionary<string, bool> _columnState)
        {
            DataGridViewIpAddressInputColumn ipCol = new DataGridViewIpAddressInputColumn();
            ipCol.HeaderCell.Style.Alignment = _alignment == 0 ? DataGridViewContentAlignment.MiddleLeft : _alignment;
            ipCol.Name = _columnName;
            ipCol.HeaderText = _headerText;
            ipCol.DataPropertyName = _dataPropertyName;
            ipCol.ToolTipText = _toolTipText;
            ipCol.Visible = _visible;
            ipCol.ReadOnly = _readOnly;
            if (_notEmpty == true)
            {
                ipCol.DefaultCellStyle.BackColor = _backColor;
            }
            _columnState.Add(_columnName, _readOnly);
            _dgv.Columns.Add(ipCol);
        }
        #endregion

        #region 創建DataGridView擴展的Lable列
        /// <summary>
        /// 創建DataGridView擴展的Lable列
        /// </summary>
        /// <param name="_dgv">要創建列的DataGridView</param>
        /// <param name="_alignment">設置列的對齊方式</param>
        /// <param name="_columnName">列名</param>
        /// <param name="_headerText">標題名</param>
        /// <param name="_dataPropertyName">綁定數據源的字段名稱</param>
        /// <param name="_toolTipText">TipText提示</param>
        /// <param name="_familyName">設置字體</param>
        /// <param name="_fontSize">設置字體大小</param>
        /// <param name="_fontStyle">設置字體樣式</param>
        /// <param name="_fontColor">設置字體顏色</param>
        /// <param name="_readOnly">設置列是否只讀,true 只讀,false 讀寫</param>
        /// <param name="_visible">設置列是否可見,true 顯示,false 隱藏</param>
        /// <param name="_notEmpty">設置列是否為必填列,true 必填,false 非必填</param>
        /// <param name="_backColor">設置列的背景色,當_notEmpty為true時,此項為必需值,為false,此項可以為Color.Empty</param>
        /// <param name="_columnState">裝載DataGridView可寫可讀、只讀列的數據字典</param>
        public static void InitDgvLableXColumn(DataGridView _dgv,
           DataGridViewContentAlignment _alignment, string _columnName, string _headerText,
           string _dataPropertyName, string _toolTipText,
           string _familyName, float _fontSize, FontStyle _fontStyle, Color _fontColor,
           bool _readOnly, bool _visible, bool _notEmpty, Color _backColor, ref Dictionary<string, bool> _columnState)
        {
            DataGridViewLabelXColumn lablelXCol = new DataGridViewLabelXColumn();
            lablelXCol.HeaderCell.Style.Alignment = _alignment == 0 ? DataGridViewContentAlignment.MiddleLeft : _alignment;
            lablelXCol.Name = _columnName;
            lablelXCol.HeaderText = _headerText;
            lablelXCol.DataPropertyName = _dataPropertyName;
            lablelXCol.ToolTipText = _toolTipText;
            lablelXCol.Visible = _visible;
            lablelXCol.ReadOnly = _readOnly;
            lablelXCol.DefaultCellStyle.ForeColor = _fontColor;
            lablelXCol.DefaultCellStyle.SelectionForeColor = _fontColor;
            lablelXCol.DefaultCellStyle.Font = new Font(_familyName, _fontSize, _fontStyle);
            if (_notEmpty == true)
            {
                lablelXCol.DefaultCellStyle.BackColor = _backColor;
            }
            _columnState.Add(_columnName, _readOnly);
            _dgv.Columns.Add(lablelXCol);
        }
        #endregion

        #region 創建DataGridView擴展的Link列
        /// <summary>
        /// 創建DataGridView擴展的Link列
        /// </summary>
        /// <param name="_dgv">要創建列的DataGridView</param>
        /// <param name="_alignment">設置列的對齊方式</param>
        /// <param name="_columnName">列名</param>
        /// <param name="_headerText">標題名</param>
        /// <param name="_dataPropertyName">綁定數據源的字段名稱</param>
        /// <param name="_toolTipText">TipText提示</param>
        /// <param name="_fontColor">設置字體顏色</param>
        /// <param name="_readOnly">設置列是否只讀,true 只讀,false 讀寫</param>
        /// <param name="_visible">設置列是否可見,true 顯示,false 隱藏</param>
        /// <param name="_notEmpty">設置列是否為必填列,true 必填,false 非必填</param>
        /// <param name="_backColor">設置列的背景色,當_notEmpty為true時,此項為必需值,為false,此項可以為Color.Empty</param>
        /// <param name="_columnState">裝載DataGridView可寫可讀、只讀列的數據字典</param>
        public static void InitDgvLinkColumn(DataGridView _dgv,
           DataGridViewContentAlignment _alignment, string _columnName, string _headerText,
           string _dataPropertyName, string _toolTipText, Color _fontColor,
           bool _readOnly, bool _visible, bool _notEmpty, Color _backColor, ref Dictionary<string, bool> _columnState)
        {
            DataGridViewLinkColumn linkCol = new DataGridViewLinkColumn();
            linkCol.HeaderCell.Style.Alignment = _alignment == 0 ? DataGridViewContentAlignment.MiddleLeft : _alignment;
            linkCol.Name = _columnName;
            linkCol.HeaderText = _headerText;
            linkCol.DataPropertyName = _dataPropertyName;
            linkCol.ToolTipText = _toolTipText;
            linkCol.Visible = _visible;
            linkCol.ReadOnly = _readOnly;
            linkCol.LinkColor = _fontColor;
            linkCol.UseColumnTextForLinkValue = true;
            linkCol.LinkBehavior = LinkBehavior.AlwaysUnderline;
            linkCol.DefaultCellStyle.ForeColor = _fontColor;
            linkCol.DefaultCellStyle.SelectionForeColor = _fontColor;
            if (_notEmpty == true)
            {
                linkCol.DefaultCellStyle.BackColor = _backColor;
            }
            _columnState.Add(_columnName, _readOnly);
            _dgv.Columns.Add(linkCol);
        }
        #endregion

        #region 創建DataGridView的擴展的MaskedTextBoxAdvColumn列
        /// <summary>
        /// 創建DataGridView的擴展的MaskedTextBoxAdvColumn列
        /// </summary>
        /// <param name="_dgv">要創建列的DataGridView</param>
        /// <param name="_alignment">設置列的對齊方式</param>
        /// <param name="_columnName">列名</param>
        /// <param name="_headerText">標題名</param>
        /// <param name="_dataPropertyName">綁定數據源的字段名稱</param>
        /// <param name="_toolTipText">TipText提示</param>
        /// <param name="_maxInputLength">可輸入的最大長度</param>
        /// <param name="_readOnly">設置列是否只讀,true 只讀,false 讀寫</param>
        /// <param name="_visible">設置列是否可見,true 顯示,false 隱藏</param>
        /// <param name="_notEmpty">設置列是否為必填列,true 必填,false 非必填</param>
        /// <param name="_backColor">設置列的背景色,當_notEmpty為true時,此項為必需值,為false,此項可以為Color.Empty</param>
        /// <param name="_buttonCustomVisible">設置是否顯示可選擇按鈕,true 顯示,false 隱藏</param>
        /// <param name="_columnState">裝載DataGridView可寫可讀、只讀列的數據字典</param>
        public static void InitDgvMaskedTextBoxAdvColumn(DataGridView _dgv,
            DataGridViewContentAlignment _alignment, string _columnName, string _headerText,
            string _dataPropertyName, string _toolTipText, int _maxInputLength, bool _readOnly, bool _visible,
            bool _notEmpty, Color _backColor, bool _buttonCustomVisible, ref Dictionary<string, bool> _columnState)
        {
            DataGridViewMaskedTextBoxAdvColumn maskedTextBoxAdvCol = new DataGridViewMaskedTextBoxAdvColumn();
            maskedTextBoxAdvCol.HeaderCell.Style.Alignment = _alignment == 0 ? DataGridViewContentAlignment.MiddleLeft : _alignment;
            maskedTextBoxAdvCol.Name = _columnName;
            maskedTextBoxAdvCol.HeaderText = _headerText;
            maskedTextBoxAdvCol.DataPropertyName = _dataPropertyName;
            maskedTextBoxAdvCol.ToolTipText = _toolTipText;
            maskedTextBoxAdvCol.MaxInputLength = _maxInputLength;
            maskedTextBoxAdvCol.Visible = _visible;
            maskedTextBoxAdvCol.ReadOnly = _readOnly;
            if (_notEmpty == true)
            {
                maskedTextBoxAdvCol.DefaultCellStyle.BackColor = _backColor;
            }
            maskedTextBoxAdvCol.ButtonCustom.Visible = _buttonCustomVisible;
            _columnState.Add(_columnName, _readOnly);
            _dgv.Columns.Add(maskedTextBoxAdvCol);
        }
        #endregion

        #region 合並單元格
        /// <summary>
        /// 合並單元格
        /// </summary>
        /// <param name="columnIndexList">合並的列索引</param>
        /// <param name="dgv">DataGridView控件</param>
        /// <param name="e"></param>
        public static void DataGridViewRowSpan(ArrayList columnIndexList, DataGridView dgv, DataGridViewCellPaintingEventArgs e)
        {
            int cellheight;
            int fontheight;
            int cellwidth;
            int fontwidth;
            int countU = 0;
            int countD = 0;
            int count = 0;
            int totalheight = 0;
            int heightU = 0;
            int heightD = 0;
            //縱向合並
            if (columnIndexList.Contains(e.ColumnIndex) && e.RowIndex >= 0)
            {
                cellheight = e.CellBounds.Height;
                fontheight = (int)e.Graphics.MeasureString(e.Value.ToString(), e.CellStyle.Font).Height;
                cellwidth = e.CellBounds.Width;
                fontwidth = (int)e.Graphics.MeasureString(e.Value.ToString(), e.CellStyle.Font).Width;
                string curValue = dgv.Rows[e.RowIndex].Cells[0].Value == null ? "" : dgv.Rows[e.RowIndex].Cells[0].Value.ToString().Trim();
                string curSelected = dgv.CurrentRow.Cells[0].Value == null ? "" : dgv.CurrentRow.Cells[0].Value.ToString().Trim();
                if (!string.IsNullOrEmpty(curValue))
                {
                    for (int i = e.RowIndex; i < dgv.Rows.Count; i++)
                    {
                        if (dgv.Rows[i].Cells[0].Value.ToString().Equals(curValue))
                        {
                            dgv.Rows[i].Cells[0].Selected = dgv.Rows[e.RowIndex].Selected;
                            dgv.Rows[i].Selected = dgv.Rows[e.RowIndex].Selected;
                            countD++;
                            heightD += dgv.Rows[i].Height;
                        }
                        else
                        {
                            break;
                        }
                    }
                    for (int i = e.RowIndex; i >= 0; i--)
                    {
                        if (dgv.Rows[i].Cells[0].Value.ToString().Equals(curValue))
                        {
                            dgv.Rows[i].Cells[0].Selected = dgv.Rows[e.RowIndex].Selected;
                            dgv.Rows[i].Selected = dgv.Rows[e.RowIndex].Selected;
                            heightU += dgv.Rows[i].Height;
                            countU++;
                        }
                        else
                        {
                            break;
                        }
                    }
                    heightU = heightU - e.CellBounds.Height;
                    totalheight = heightU + heightD;
                    count = countD + countU - 1;
                    if (count < 2) { return; }
                }


                Brush gridBrush = new SolidBrush(dgv.GridColor),
                backColorBrush = new SolidBrush(e.CellStyle.BackColor);

                Pen gridLinePen = new Pen(gridBrush);

                // 擦除原單元格背景
                e.Graphics.FillRectangle(backColorBrush, e.CellBounds);
                ////繪制線條,這些線條是單元格相互間隔的區分線條,
                ////因為我們只對列name做處理,所以datagridview自己會處理左側和上邊緣的線條
                if (e.RowIndex != dgv.RowCount - 1)
                {
                    if (e.Value.ToString() != dgv.Rows[e.RowIndex + 1].Cells[e.ColumnIndex].Value.ToString())
                    {
                        e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left, e.CellBounds.Bottom - 1,
                        e.CellBounds.Right - 1, e.CellBounds.Bottom - 1);//下邊緣的線
                        //繪制值
                        if (e.Value != null)
                        {
                            e.Graphics.DrawString(e.Value.ToString(), e.CellStyle.Font,
                                Brushes.Black, e.CellBounds.X,
                            e.CellBounds.Y - heightU + (totalheight - fontheight) / 2,
                            StringFormat.GenericDefault);
                        }
                    }
                    else
                    {
                        //繪制值
                        if (e.Value != null)
                        {
                            e.Graphics.DrawString(e.Value.ToString(), e.CellStyle.Font,
                                Brushes.Black, e.CellBounds.X,
                            e.CellBounds.Y - heightU + (totalheight - fontheight) / 2,
                            StringFormat.GenericDefault);
                        }
                    }
                }
                else
                {
                    e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left, e.CellBounds.Bottom - 1,
                        e.CellBounds.Right - 1, e.CellBounds.Bottom - 1);//下邊緣的線
                    //繪制值
                    if (e.Value != null)
                    {
                        e.Graphics.DrawString(e.Value.ToString(), e.CellStyle.Font,
                            Brushes.Black, e.CellBounds.X,
                            e.CellBounds.Y - heightU + (totalheight - fontheight) / 2,
                            StringFormat.GenericDefault);
                    }
                }
                //右側的線
                e.Graphics.DrawLine(gridLinePen, e.CellBounds.Right - 1,
                    e.CellBounds.Top, e.CellBounds.Right - 1,
                    e.CellBounds.Bottom - 1);
                e.Handled = true;

            }

            //單擊單元格改變顏色
            dgv.CellClick += new DataGridViewCellEventHandler(dgv_CellClick);

        }

        private static int rowIndex = -1;
        private static int colIndex = -1;
        static void dgv_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                DataGridView dgv = (DataGridView)sender;
                rowIndex = e.RowIndex;
                colIndex = e.RowIndex;
                for (int i = 0; i < dgv.Rows.Count; i++)
                {
                    for (int j = 0; j < dgv.Columns.Count; j++)
                    {
                        if (dgv.Rows[i].Cells[j] != dgv.Rows[rowIndex].Cells[colIndex])
                        {
                            dgv.Rows[i].Cells[j].Style.BackColor = Color.White;
                            dgv.Rows[i].Cells[j].Style.ForeColor = Color.Black;
                        }
                        else
                        {
                            dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.BackColor = SystemColors.Info;
                        }
                    }
                }

                dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.ForeColor = Color.Black;

            }
            catch
            {

            }
        }
        #endregion
    }
}
View Code

2.

應用

#region  構建DataGirdView列
        /// <summary>
        ///裝載DataGridView可寫可讀、只讀列的數據字典
        ///Author:  
        ///WriteTime: 2014-01-22 23:49:37 
        /// </summary>
        private Dictionary<string, bool> ColumnState = new Dictionary<string, bool>();

        /// <summary>
        ///構建DataGirdView列
        ///Author:  
        ///WriteTime: 2014-01-22 23:49:37 
        /// </summary>
        private void InitDataGirdViewColumn()
        {
            Image imageDV = null;
            this.dgvParent.Columns.Clear();
            DgvTools.InitDgvCheckBoxColumn(this.dgvParent, DataGridViewContentAlignment.MiddleCenter,
                "選擇", "選擇", "選擇", "", false, true, false, Color.Empty, ref ColumnState);
            DgvTools.InitDgvTextBoxColumn(this.dgvParent, DataGridViewContentAlignment.MiddleCenter,
                "_AutoID", "_AutoID", "_AutoID", "", 40, true, true, false, Color.Empty, ref ColumnState);
            DgvTools.InitDgvTextBoxColumn(this.dgvParent, DataGridViewContentAlignment.MiddleCenter,
                "_ID", "_ID", "_ID", "", 100, true, true, false, Color.Empty, ref ColumnState);
            DgvTools.InitDgvTextBoxColumn(this.dgvParent, DataGridViewContentAlignment.MiddleCenter,
                "CODE", "編號", "CODE", "", 100, true, true, false, Color.Empty, ref ColumnState);
            DgvTools.InitDgvImageColumn(this.dgvParent, DataGridViewContentAlignment.MiddleCenter,
                "Pic", "圖片", "Pic", "", imageDV, DataGridViewImageCellLayout.Normal, true, true, false, Color.Empty, ref ColumnState);
            DgvTools.InitDgvTextBoxColumn(this.dgvParent, DataGridViewContentAlignment.MiddleCenter,
                "Note", "說明", "Note", "", 100, true, true, false, Color.Empty, ref ColumnState);
            this.dgvParent.Columns[0].Width = 65;
            this.dgvParent.Columns[0].Frozen = true;

        }
        #endregion
View Code


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM