×

C# 让datagridview的DataGridviewComboBoxColumn即可以下拉,还可以输入内容

勇哥,很想停止 勇哥,很想停止 发表于2023-03-31 14:39:17 浏览3535 评论0

抢沙发发表评论


让datagridview的DataGridviewComboBoxColumn即可以下拉,还可以输入内容

这个需求是有必要的。

勇哥参考了一些网上的资料,证明winform还是可以实现此功能的。

虽然操作上有点不太方便,比如输入内容后回车不能结束编辑,需要点内外的单元格结束编辑。

但是好歹是实现的要求,而且不用重写一些方法。


效果如下:

image.png


演示代码:

  public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            BindComboxItems();
            this.dataGridView1.EditingControlShowing += new DataGridViewEditingControlShowingEventHandler(EnabledComboBoxWrite);
        }

        private void EnabledComboBoxWrite(object sender, DataGridViewEditingControlShowingEventArgs e)
        {
            ComboBox cb = e.Control as ComboBox;
            if (cb != null)
            {
                cb.DropDownStyle = ComboBoxStyle.DropDown;
                cb.Validating += new System.ComponentModel.CancelEventHandler(cb_Validating);
            }

        }

        void cb_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;

            if (cbo.Items.IndexOf(value) == -1)
            {
                DataGridViewComboBoxColumn cboCol = (DataGridViewComboBoxColumn)grid.Columns[grid.CurrentCell.ColumnIndex];
                cbo.Items.Add(value);
                cboCol.Items.Add(value);
                grid.CurrentCell.Value = value;
            }
        }
        private void BindComboxItems()
        {
            DataGridViewComboBoxColumn col = (DataGridViewComboBoxColumn)dataGridView1.Columns[0];
            col.Items.Add("");
            col.Items.Add("aaa");
            col.Items.Add("bbb");
            col.Items.Add("ccc");
        }
    }



代码下载:

---------------------

[Xhide][/Xhide]


群贤毕至

访客