我自定义了一个可编辑的DataGridViewComboBoxColumn,但发现了一个问题,我创建了两列自定义控件列,然后我给其中一列绑定数据,可奇怪的是既然两列都会有数据。调试后发现,DataGridViewComboBoxEditingControl类(就是编辑时候显示的控件),只创建了一次,按理应该是每个单元格创建一次的呀。而且我也没办法控制它什么时候创建,好像是系统自动创建的。请问这是怎么回事??

解决方案 »

  1.   

    DataGridViewComboBoxColumn列是怎么加的?
      

  2.   

    就 new 两个列 添加进DataGridView啊
      

  3.   

              DataGridViewEditComboBoxColumn dgvc = new DataGridViewEditComboBoxColumn();
                dgvc.HeaderText = "列1";
                DataTable dt = new DataTable();
                dt.Columns.Add(new DataColumn("num1"));
                DataRow dr = dt.NewRow();
                dr[0] = 1;
                dt.Rows.Add(dr);
                dgvc.DataSource = dt;
                dgvc.DisplayMember = "num1";
                dgvc.ValueMember = "num1";
                dataGridView1.Columns.Add(dgvc);
                dgvc = new DataGridViewEditComboBoxColumn();
                dgvc.HeaderText = "列2";
                dataGridView1.Columns.Add(dgvc);
    就是这样绑定的
      

  4.   

    因为定义了DataGridViewComboBoxColumn相同的控件的原因。
      

  5.   

    其实我没有用相同名称,我只是为了描述方便才用DataGridViewComboBoxColumn
      

  6.   

    你可以将第二个列的DataSource设置为null试试
      

  7.   


    说的不错!var c1 = new DataGridViewEditComboBoxColumn();
    var c2 = new DataGridViewEditComboBoxColumn();c1.HeaderText = "列1";
    c2.HeaderText = "列2";dataGridView1.Columns.Add(c1);
    dataGridView1.Columns.Add(c2);
      

  8.   

    我调试过了,主要原因就是DataGridViewEditComboBoxEditingControl只创建了一次。按理应该是每个单元格创建一次的
      

  9.   

    那问题是出在 DataGridViewEditComboBoxEditingControl 里面的吧!
      

  10.   

    DataGridViewEditComboBoxEditingControl  你说这个只触发一次是什么意思?你知道这个到底是啥意思不?相信你应该是在editingcontrolshowing事件中使用的吧  他是表示当前正在编辑的控件  你说怎么可能一下子触发多次呢???也许是我没理解你说的意思!
      

  11.   

    我把代码发出来吧!using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Windows.Forms;
    using System.Data;
    using System.Drawing;public class DataGridViewEditComboBoxColumn : DataGridViewColumn
    {
        /// <summary>
        /// 初始化
        /// </summary>
        public DataGridViewEditComboBoxColumn()
            : base(new DataGridViewEditComboBocCell())
        {
        }    /// <summary>
        /// 获取或设置用于创建新单元格的模板。
        /// </summary>
        public override DataGridViewCell CellTemplate
        {
            get
            {
                return base.CellTemplate;
            }
            set
            {
                // Ensure that the cell used for the template is a DataGridCell.
                if (value != null &&
                    !value.GetType().IsAssignableFrom(typeof(DataGridViewEditComboBocCell)))
                {
                    throw new InvalidCastException("Must be a DataGridCell");
                }
                base.CellTemplate = value;
            }
        }
    }
    public class DataGridViewEditComboBocCell : DataGridViewTextBoxCell
    {
        public DataGridViewEditComboBocCell()
            : base()
        {    }    /// <summary>
        /// 附加并初始化寄宿的编辑控件。
        /// </summary>
        /// <param name="rowIndex"></param>
        /// <param name="initialFormattedValue"></param>
        /// <param name="dataGridViewCellStyle"></param>
        public override void InitializeEditingControl(int rowIndex, object
            initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
        {
            // Set the value of the editing control to the current cell value.
            base.InitializeEditingControl(rowIndex, initialFormattedValue,
                dataGridViewCellStyle);        DataGridViewEditComboBoxEditingControl ctl =
               DataGridView.EditingControl as DataGridViewEditComboBoxEditingControl;
            ctl.Text = (string)this.Value;
        }    /// <summary>
        /// 编辑时的类型
        /// </summary>
        public override Type EditType
        {
            get
            {
                // Return the type of the editing contol that DataGridCell uses.
                return typeof(DataGridViewEditComboBoxEditingControl);
            }
        }    /// <summary>
        /// 值类型
        /// </summary>
        public override Type ValueType
        {
            get
            {
                // Return the type of the value that DataGridCell contains.
                return typeof(string);
            }
        }
        /// <summary>
        /// 默认值
        /// </summary>
        public override object DefaultNewRowValue
        {
            get
            {
                // Use the current date and time as the default value.
                return "";
            }
        }
        public override object Clone()
        {
            DataGridViewEditComboBocCell cell = new DataGridViewEditComboBocCell();
            return cell;
        }
    }
    public class DataGridViewEditComboBoxEditingControl : ComboBox, IDataGridViewEditingControl
    {
        private DataGridView dataGridView;
        private bool valueChanged = false;
        int rowIndex;
        public DataGridViewEditComboBoxEditingControl()
        {
        }
        // 摘要:
        //     获取或设置包含单元格的 System.Windows.Forms.DataGridView。
        public DataGridView EditingControlDataGridView
        {
            get
            {
                return this.dataGridView;
            }
            set
            {
                this.dataGridView = value;
            }
        }
        //
        // 摘要:
        //     获取或设置编辑器正在修改的单元格的格式化值。
        public object EditingControlFormattedValue
        {
            get
            {
                return this.GetEditingControlFormattedValue(DataGridViewDataErrorContexts.Formatting);
            }
            set
            {
                string strA = value as string;
                if (strA != null)
                {
                    this.Text = strA;
                }
            }
        }
        //
        // 摘要:
        //     获取或设置该承载单元格的父行的索引。
        //
        // 返回结果:
        //     包含该单元格的行的索引,如果没有父行,则为 -1。
        public int EditingControlRowIndex
        {
            get
            {
                return this.rowIndex;
            }
            set
            {
                this.rowIndex = value;
            }
        }
        //
        // 摘要:
        //     获取或设置一个值,该值指示编辑控件的值是否与承载单元格的值不同。
        //
        // 返回结果:
        //     如果控件的值与单元格的值不同,则为 true;否则为 false。
        public bool EditingControlValueChanged
        {
            get
            {
                return this.valueChanged;
            }
            set
            {
                this.valueChanged = value;
            }
        }
        //
        // 摘要:
        //     获取当鼠标指针位于 System.Windows.Forms.DataGridView.EditingPanel 上方但不位于编辑控件上方时所使用的光标。
        //
        // 返回结果:
        //     一个 System.Windows.Forms.Cursor,表示用于编辑面板的鼠标指针。
        public Cursor EditingPanelCursor
        {
            get
            {
                return base.Cursor;
            }
        }
        //
        // 摘要:
        //     获取或设置一个值,该值指示每当值更改时,是否需要重新定位单元格的内容。
        //
        // 返回结果:
        //     如果需要重新定位单元格内容,则为 true;否则为 false。
        public bool RepositionEditingControlOnValueChange
        {
            get
            {
                return false;
            }
        }    // 摘要:
        //     更改控件的用户界面 (UI),使之与指定单元格样式一致。
        //
        // 参数:
        //   dataGridViewCellStyle:
        //     要用作用户界面的模型的 System.Windows.Forms.DataGridViewCellStyle。
        public void ApplyCellStyleToEditingControl(DataGridViewCellStyle dataGridViewCellStyle)
        {
            this.Font = dataGridViewCellStyle.Font;
            if (dataGridViewCellStyle.BackColor.A < 0xff)
            {
                Color color = Color.FromArgb(0xff, dataGridViewCellStyle.BackColor);
                this.BackColor = color;
                this.dataGridView.EditingPanel.BackColor = color;
            }
            else
            {
                this.BackColor = dataGridViewCellStyle.BackColor;
            }
            this.ForeColor = dataGridViewCellStyle.ForeColor;
        }
        //
        // 摘要:
        //     确定指定的键是应由编辑控件处理的常规输入键,还是应由 System.Windows.Forms.DataGridView 处理的特殊键。
        public bool EditingControlWantsInputKey(Keys keyData, bool dataGridViewWantsInputKey)
        {
            if (((((keyData & Keys.KeyCode) != Keys.Down) && ((keyData & Keys.KeyCode) != Keys.Up))
                && (((keyData & Keys.KeyCode) != Keys.Escape))) &&
                ((keyData & Keys.KeyCode) != Keys.Return))
            {
                return !dataGridViewWantsInputKey;
            }
            return true;
        }
        //
        // 摘要:
        //     检索单元格的格式化值。
        public object GetEditingControlFormattedValue(DataGridViewDataErrorContexts context)
        {
            return this.Text;
        }
        //
        // 摘要:
        //     准备当前选中的单元格以进行编辑。
        //
        // 参数:
        //   selectAll:
        //     为 true,则选择单元格的全部内容;否则为 false。
        public void PrepareEditingControlForEdit(bool selectAll)
        {    }    protected override void OnTextChanged(EventArgs e)
        {
            this.valueChanged = true;
            this.EditingControlDataGridView.NotifyCurrentCellDirty(true);
            base.OnTextChanged(e);
        }
        protected override void OnSelectedIndexChanged(EventArgs e)
        {
            this.valueChanged = true;
            this.EditingControlDataGridView.NotifyCurrentCellDirty(true);
            base.OnTextChanged(e);
        }
    }
      

  12.   

    我觉得应该是在DataGridViewEditComboBocCell