DataGridView DataGridViewComboBox可编辑

来源:互联网 发布:手机拨打软件 编辑:程序博客网 时间:2024/04/29 13:20

datagridview 中的DataGridViewComboBoxColumn

下拉选项类型,只能像web中的DropDownList下拉,不能编辑,修改了displaystyle属性,仍然无效果。

搜索一下,得到一下结果,

http://hi.baidu.com/goga/blog/item/5bd4908f5f2685f2503d92cf.html

[C#][WinForm]DataGridView中使DataGridViewComboBox可编辑

为了适应我的需要,代码经过我的修正如下:

新建一个类文件保存起来

[C#_Code]

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.ComponentModel;

namespace Elephant.FormUtils
{
    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;
            }
        }
    }

}

[/C#_Code]

在调用页引入 using Elephant.FormUtils;

在datagridview设计页中,可以看到ColumnType多了DataGridViewComboEditBoxColumn,这正是我想要的。

image

因为我每行的下拉框内容都不一样,所以代码这么写:

          [C#_Code]

                    DataGridViewComboBoxCell combox_cell = ((DataGridViewComboBoxCell)dgv_items.CurrentRow.Cells["unit"]);

                    //ii._unit_price是一个datatable

                   //combox_cell.DataSource = ii._unit_price;这样赋值,会报错!

                    //combox_cell.DataSource = ii._unit_price;   
                    combox_cell.Items.Clear();
                    combox_cell.Items.AddRange(ii._unit_price);
                    combox_cell.DisplayMember = "unit";
                    combox_cell.Value = ii._unit_price.Rows[0]["unit"].ToString();

[/C#_Code]

image 

效果如下:

image image image

原创粉丝点击