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;
                }
            }
        }

    }

  • 相关阅读:
    MongoDB优化之一:常见优化方法
    Spark Streaming之一:整体介绍
    Java中实现MongoDB自增主键ID
    RDD之一:总体介绍
    对一致性Hash算法,Java代码实现的深入研究
    MongoDB 创建基础索引、组合索引、唯一索引以及优化
    mongo-查询
    MongoTemplate聚合操作
    RESTLET开发实例(一)基于JAX-RS的REST服务
    Hashtable的实现原理
  • 原文地址:https://www.cnblogs.com/lvfeilong/p/dsffgvsdsf.html
Copyright © 2011-2022 走看看