DataGridView中使DataGridViewComboBox可编辑

第一步,新建窗体,放置一个DataGridView控件

第二步,在Form1相同命名空间中加入以下两个类

//要加入的类
public class DataGridViewComboEditBoxColumn : DataGridViewComboBoxColumn
{
    public DataGridViewComboEditBoxColumn()
    {
        DataGridViewComboEditBoxCell obj = new DataGridViewComboEditBoxCell();
        this.CellTemplate = obj;
    }
}

//要加入的类
public class DataGridViewComboEditBoxCell : DataGridViewComboBoxCell
{
    public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
    {
        base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle);

        ComboBox comboBox = (ComboBox)base.DataGridView.EditingControl;

        if (comboBox != null)
        {
            comboBox.DropDownStyle = ComboBoxStyle.DropDown;
            comboBox.AutoCompleteMode = AutoCompleteMode.Suggest;
            comboBox.Validating += new CancelEventHandler(comboBox_Validating);
        }
    }

    protected override object GetFormattedValue(object value, int rowIndex, ref DataGridViewCellStyle cellStyle, TypeConverter valueTypeConverter, TypeConverter formattedValueTypeConverter, DataGridViewDataErrorContexts context)
    {
        if (value != null)
        {
            if (value.ToString().Trim() != string.Empty)
            {
                if (Items.IndexOf(value) == -1)
                {
                    Items.Add(value);
                    DataGridViewComboBoxColumn col = (DataGridViewComboBoxColumn)OwningColumn;
                    col.Items.Add(value);
                }
            }
        }
        return base.GetFormattedValue(value, rowIndex, ref cellStyle, valueTypeConverter, formattedValueTypeConverter, context);
    }

    void comboBox_Validating(object sender, System.ComponentModel.CancelEventArgs e)
    {
        DataGridViewComboBoxEditingControl cbo = (DataGridViewComboBoxEditingControl)sender;
        if (cbo.Text.Trim() == string.Empty) return;

        DataGridView grid = cbo.EditingControlDataGridView;
        object value = cbo.Text;

        // Add value to list if not there
        if (cbo.Items.IndexOf(value) == -1)
        {
            DataGridViewComboBoxColumn cboCol = (DataGridViewComboBoxColumn)grid.Columns[grid.CurrentCell.ColumnIndex];
            // Must add to both the current combobox as well as the template, to avoid duplicate entries
            cbo.Items.Add(value);
            cboCol.Items.Add(value);
            grid.CurrentCell.Value = value;
        }
    }
}

//添加完这两个类后,右键项目生成一次。


第三步,为DataGridView添加列,类型选“DataGridViewComboEditBoxColumn ”,上面那个类的名字

 

上面已经基本完成,为了演示效果,请继续向下看!

第四步,在FormLoad事件中加入下面代码

        private void Form1_Load(object sender, EventArgs e)
        {
            this.Column1.Items.AddRange(new string[] { "aaa", "bbb", "ccc" });
        }

最终效果:

 

完成代码:

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

namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            this.Column1.Items.AddRange(new string[] { "aaa", "bbb", "ccc" });
        }
    }

    public class DataGridViewComboEditBoxColumn : DataGridViewComboBoxColumn
    {
        public DataGridViewComboEditBoxColumn()
        {
            DataGridViewComboEditBoxCell obj = new DataGridViewComboEditBoxCell();
            this.CellTemplate = obj;
        }
    }

    public class DataGridViewComboEditBoxCell : DataGridViewComboBoxCell
    {
        public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
        {
            base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle);

            ComboBox comboBox = (ComboBox)base.DataGridView.EditingControl;

            if (comboBox != null)
            {
                comboBox.DropDownStyle = ComboBoxStyle.DropDown;
                comboBox.AutoCompleteMode = AutoCompleteMode.Suggest;
                comboBox.Validating += new CancelEventHandler(comboBox_Validating);
            }
        }

        protected override object GetFormattedValue(object value, int rowIndex, ref DataGridViewCellStyle cellStyle, TypeConverter valueTypeConverter, TypeConverter formattedValueTypeConverter, DataGridViewDataErrorContexts context)
        {
            if (value != null)
            {
                if (value.ToString().Trim() != string.Empty)
                {
                    if (Items.IndexOf(value) == -1)
                    {
                        Items.Add(value);
                        DataGridViewComboBoxColumn col = (DataGridViewComboBoxColumn)OwningColumn;
                        col.Items.Add(value);
                    }
                }
            }
            return base.GetFormattedValue(value, rowIndex, ref cellStyle, valueTypeConverter, formattedValueTypeConverter, context);
        }

        void comboBox_Validating(object sender, System.ComponentModel.CancelEventArgs e)
        {
            DataGridViewComboBoxEditingControl cbo = (DataGridViewComboBoxEditingControl)sender;
            if (cbo.Text.Trim() == string.Empty) return;

            DataGridView grid = cbo.EditingControlDataGridView;
            object value = cbo.Text;

            // Add value to list if not there
            if (cbo.Items.IndexOf(value) == -1)
            {
                DataGridViewComboBoxColumn cboCol = (DataGridViewComboBoxColumn)grid.Columns[grid.CurrentCell.ColumnIndex];
                // Must add to both the current combobox as well as the template, to avoid duplicate entries
                cbo.Items.Add(value);
                cboCol.Items.Add(value);
                grid.CurrentCell.Value = value;
            }
        }
    }

}

原文地址:https://www.cnblogs.com/lvfeilong/p/dsffgvsdsf.html