如何在DataGridView中加入自定义组件

    技术2022-05-20  39

    我想在DataGridView编辑时显示如下图控件:

     

    (1)创建一个自定义组件UserControl,并继承IDataGridViewEditingControl接口(用意:在DataGridView进入编辑状态时可以调用该控件),添加如下代码:

    using System;using System.Collections.Generic;using System.ComponentModel;using System.Drawing;using System.Data;using System.Text;using System.Windows.Forms;

    namespace Class.baseSys.controlSys{

        public partial class UserControl1 : UserControl, IDataGridViewEditingControl    {        int rowIndex;        DataGridView dataGridView;        private bool valueChanged = false; 

            public UserControl1()        {                        InitializeComponent();        }

            /// <summary>          /// 更改控件的用户界面 (UI),使之与指定单元格样式一致。          /// </summary>          /// <param name="dataGridViewCellStyle">要用作用户界面的模型的 System.Windows.Forms.DataGridViewCellStyle。</param>          public void ApplyCellStyleToEditingControl(DataGridViewCellStyle dataGridViewCellStyle)        {            this.Font = dataGridViewCellStyle.Font;            this.textBox1.ForeColor = dataGridViewCellStyle.ForeColor;            this.textBox1.BackColor = dataGridViewCellStyle.BackColor;         }

            /// <summary>          /// 确定指定的键是应由编辑控件处理的常规输入键,还是应由 System.Windows.Forms.DataGridView 处理的特殊键。          /// </summary>          /// <param name="key">一个 System.Windows.Forms.Keys,表示按下的键。</param>          /// <param name="dataGridViewWantsInputKey">当 System.Windows.Forms.DataGridView 要处理 keyData 中的 System.Windows.Forms.Keys时,则为 true;否则为 false。</param>          /// <returns>如果指定的键是应由编辑控件处理的常规输入键,则为 true;否则为 false。</returns>          public bool EditingControlWantsInputKey(Keys keyData, bool dataGridViewWantsInputKey)        {            switch (keyData & Keys.KeyCode)     //设置方向键等都不令其进入编辑状态            {                case Keys.Left:                case Keys.Up:                case Keys.Down:                case Keys.Right:                case Keys.Home:                case Keys.End:                case Keys.PageDown:                case Keys.PageUp:                    return true;                default:                    return false;            }          }

            /// <summary>          /// 检索单元格的格式化值。          /// </summary>          /// <param name="context">System.Windows.Forms.DataGridViewDataErrorContexts 值的按位组合,它指定需要数据的上下文。</param>          /// <returns>一个 System.Object,表示单元格内容的格式化版本。</returns>          public object GetEditingControlFormattedValue(DataGridViewDataErrorContexts context)        {            return EditingControlFormattedValue;        }

            /// <summary>          /// 准备当前选中的单元格以进行编辑。          /// </summary>          /// <param name="selectAll">为 true,则选择单元格的全部内容;否则为 false。</param>          public void PrepareEditingControlForEdit(bool selectAll)        {                    }

            /// <summary>          /// 获取或设置包含单元格的 System.Windows.Forms.DataGridView。          /// </summary>          public DataGridView EditingControlDataGridView        {            get            {                return dataGridView;            }            set            {                dataGridView = value;            }          }

            /// <summary>          /// 实现接口 IDataGridViewEditingControl.EditingControlFormattedValue           /// </summary>          public object EditingControlFormattedValue        {            get { return this.textBox1.Text;}            set { this.textBox1.Text = value.ToString(); }        }

            /// <summary>        /// 增加属性设置TextBox的值        /// </summary>        public String tetText        {            get { return this.textBox1.Text; }            set { this.textBox1.Text = value.ToString(); }        }

            /// <summary>          /// 获取或设置该承载单元格的父行的索引。包含该单元格的行的索引,如果没有父行,则为 -1。          /// </summary>          public int EditingControlRowIndex        {            get            {                                return rowIndex;            }            set            {                rowIndex = value;            }          }

            /// <summary>          /// 获取或设置一个值,该值指示编辑控件的值是否与承载单元格的值不同。          /// </summary>          public bool EditingControlValueChanged        {            get            {                return valueChanged;            }            set            {                valueChanged = value;            }        }

            /// <summary>          /// 获取当鼠标指针位于 System.Windows.Forms.DataGridView.EditingPanel 上方但不位于编辑控件上方时所使用的光标。          /// </summary>          public Cursor EditingPanelCursor        {            get            {                return base.Cursor;            }        }

            /// <summary>          /// 获取或设置一个值,该值指示每当值更改时,是否需要重新定位单元格的内容。          /// </summary>          public bool RepositionEditingControlOnValueChange        {            get            {                return false;            }        }

            /// <summary>          /// 修改TextBox值时通知datagridviewCell.        /// </summary>          /// <param name="eventargs"></param>          private void textBox1_TextChanged(object sender, EventArgs e)        {

                //DataGridView中Cell的Changed事件               valueChanged = true;              this.EditingControlDataGridView.NotifyCurrentCellDirty(true);                  } 

                }}

     

    (2)增加控新地DataGridViewCell控件,使期在编辑时调用自定义组件

    using System;using System.Collections.Generic;using System.Text;using System.Windows.Forms;

    namespace Class.baseSys.controlSys{    /// <summary>      /// 选择输入控件    /// </summary>      public class CalendarColumn : DataGridViewColumn      {          public CalendarColumn() : base(new CalendarCell())          {          }          /// <summary>          /// 获取或设置用于创建新单元格的模板。          /// </summary>          public override DataGridViewCell CellTemplate          {              get              {                  return base.CellTemplate;              }              set              {                  //确认单元格使用了自定义的日期单元格模版                  if (value != null && !value.GetType().IsAssignableFrom(typeof(TetInputCell)))                  {                      throw new InvalidCastException(/*Class.Properties.Resources.Message*/);                  }                  base.CellTemplate = value;              }          }      }      /// <summary>      /// 日期单元格      /// </summary>      public class TetInputCell : DataGridViewTextBoxCell    {        public TetInputCell()            : base()        {            // 默认为短日期型              //this.Style.Format = "c";        }        /// <summary>          /// 初始化用于编辑单元格的控件。          /// </summary>          /// <param name="rowIndex">单元格所在位置的从零开始的行索引。</param>          /// <param name="initialFormattedValue">它表示在开始编辑时单元格显示的值。</param>          /// <param name="dataGridViewCellStyle">表示单元格样式的 System.Windows.Forms.DataGridViewCellStyle。</param>          public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)        {                        //初始化之后设置编辑状态的值              base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle);

                UserControl1 ctl = (UserControl1)DataGridView.EditingControl;            //Value = "111";            if (Value != null && Value != System.DBNull.Value)                ctl.tetText = this.Value.ToString();        }        /// <summary>          /// 获取单元格的寄宿编辑控件的类型。          /// </summary>          public override Type EditType        {            get            {                return typeof(UserControl1);            }        }        /// <summary>          /// 获取或设置单元格中值的数据类型。          /// </summary>          public override Type ValueType        {            get            {                return typeof(String);            }        }        /// <summary>          /// 获取新记录所在行中单元格的默认值。          /// </summary>          public override object DefaultNewRowValue        {            get            {                return "";            }        }    }

    }

    (3)程序调用

    CustormerDgv dgView = null;


    最新回复(0)