zoukankan      html  css  js  c++  java
  • 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;
                }
            }
        }

    }

  • 相关阅读:
    1.配置pytorch环境
    排序算法总结
    树的存储
    递归回溯法求N皇后问题
    输出分割的字符串
    文件的操作
    Okhttp进行文件的下载
    Android客户端OkHttp的使用以及tomcat服务器的解析客户端发过来的数据
    java集合框架
    spring mvc框架入门
  • 原文地址:https://www.cnblogs.com/lvfeilong/p/dsffgvsdsf.html
Copyright © 2011-2022 走看看