我原来所做的编辑是一个基于textbox的类,现在idatagridvieweditingcontrol是通过一个自定义控件(包含一个textbox和button)来实现的,结果就发现按下字符键,第一个字符就是没有,如输入三个a,那么控件中只显示两个a,也就是按下的第一个键作了编辑的确认键了,不知道为什么

解决方案 »

  1.   


    using System;
    using System.Windows;
    using System.Windows.Forms;
    using System.Collections.Generic;
    using System.Text;
    using System.Data;namespace BaseItems
    {
        class CellCommSelEditWS:TbxCommWS, IDataGridViewEditingControl
        {
            DataGridView dataGridView;
            bool valueChanged = false;
            int rowIndex;
            public CellCommSelEditWS()
            {
                //base.EditMode = false;
                base.BorderStyle = BorderStyle.None;
                base.textbox.BorderStyle = BorderStyle.None;
            }
            string _commselid = "";
            public int EditingControlRowIndex
            {
                get { return rowIndex; }
                set { rowIndex = value; }
            }
            protected override void OnTextChanged(EventArgs e)
            {
                base.OnTextChanged(e);
                valueChanged = true;
                this.EditingControlDataGridView.NotifyCurrentCellDirty(true);
            }
            
           
            public bool EditingControlValueChanged
            {
                set { valueChanged = value; }
                get { return valueChanged; }        }
            public object EditingControlFormattedValue
            {
                get
                {
                    return this.Text.ToString();
                }
                set
                {
                    this.Text = value.ToString();
                }
            }        // Implements the 
            // IDataGridViewEditingControl.GetEditingControlFormattedValue method.
            public object GetEditingControlFormattedValue(DataGridViewDataErrorContexts context)
            {
                return EditingControlFormattedValue;
            }        // Implements the 
            // IDataGridViewEditingControl.ApplyCellStyleToEditingControl method.
            public void PrepareEditingControlForEdit(bool selectAll)
            {
                //i have something to do with prepare
                //initialize commsel;
                //set the value and without uniquecheck
            }
            public void ApplyCellStyleToEditingControl(DataGridViewCellStyle dataGridViewCellStyle)
            {
                this.Font = dataGridViewCellStyle.Font;
            }
            public bool EditingControlWantsInputKey(Keys key, bool dataGridViewWantsInputKey)
            {
                // Let the DateTimePicker handle the keys listed.
                switch (key & Keys.KeyCode)
                {
                    case Keys.Left:
                    case Keys.Up:
                    case Keys.Down:
                    case Keys.Right:
                    case Keys.Home:
                    case Keys.End:
                    case Keys.PageDown:
                    case Keys.PageUp:
                        return true;
                    default:
                        return false;
                }
            }
            public bool RepositionEditingControlOnValueChange
            {
                get { return true; }
            }
            public DataGridView EditingControlDataGridView
            {
                get { return dataGridView; }
                set { dataGridView = value; }
            }
            public Cursor EditingPanelCursor
            {
                get
                {
                    return base.Cursor;
                }
            }
        }
        public class CellCommSelWS : DataGridViewTextBoxCell
        {
            public CellCommSelWS()
                : base()
            {
            }
            CellCommSelEditWS ctl;
            public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
            {
                base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle);
                ctl = DataGridView.EditingControl as CellCommSelEditWS;
                ctl.Text = this.Value.ToString();
                //ctl.ConnString = ((commselColumn)base.OwningColumn).ConnString;
                string tid = "";
                //DataRowView drv = (DataRowView)base.OwningRow.DataBoundItem;
                tid = ((GDColumnWS)base.OwningColumn).CommonSelectionID;
                //if (tid != "")
                //{
                //    tid = drv[((GDColumnWS)base.OwningColumn).CommonSelectionID].ToString();
                //}
                //else
                //{
                //    tid = "";
                //}
                //ctl.ConnString = _cn;
                ctl.CommEditID = tid;        }
            public void setSection(string id)
            {
                ctl.CommEditID= id;
            }
            public override Type EditType
            {
                get
                {
                    return typeof(CellCommSelEditWS);
                }
            }        public override Type ValueType
            {
                get
                {
                    return typeof(string);
                }
            }        public override object DefaultNewRowValue
            {
                get
                {
                    return "";
                }
            }
        }
        public class GDColumnWS : DataGridViewTextBoxColumn
        {
            public GDColumnWS()
                : base()
            {
            }
            string _ftid = "";
            public string CommonSelectionID
            {
                set { _ftid = value; }
                get { return _ftid; }
            }
            CellCommSelWS _celledit;
            public override DataGridViewCell CellTemplate
            {
                get
                {
                    return _celledit;
                }
                set
                {
                    if (value != null && !value.GetType().IsAssignableFrom(typeof(CellCommSelWS)))
                    {
                        throw new InvalidCastException("Must be a Common Selection Cell");
                    }
                    _celledit = (CellCommSelWS)value;
                }
            }
        }}
      

  2.   

    TbxCommWS是一个TextBox和Button组合成的自定义控件
      

  3.   

       void dataGridView1_EditingControlShowing(object sender, 
                DataGridViewEditingControlShowingEventArgs e)
            {
                if (!this.IsKeyPressHandled
                    && this.dataGridView1.CurrentCell.ColumnIndex == 
                    this.dataGridView1.Columns["MaskColumn"].Index)
                {
                    TextBox tb = e.Control as TextBox;
                    tb.KeyPress += new KeyPressEventHandler(tb_KeyPress);
                    this.IsKeyPressHandled = true;
                }
            }        void tb_KeyPress(object sender, KeyPressEventArgs e)
            {
                if (this.dataGridView1.CurrentCell.ColumnIndex == 
                    this.dataGridView1.Columns["MaskColumn"].Index)
                {
                    // Prevent the key char to be input in the editing control
                    e.Handled = true;                // Set focus to the MaskedTextBox for editing.
                    this.maskedTextBoxForEditing.Text = e.KeyChar.ToString();
                    this.maskedTextBoxForEditing.Focus();
                }
            }