现在的位置: 首页 > 综合 > 正文

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

2013年10月30日 ⁄ 综合 ⁄ 共 7256字 ⁄ 字号 评论关闭

我想在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;

抱歉!评论已关闭.