继承TextBox自定义DataGridView列输入数据后怎样在离开焦点时提交,而不是每输一个字母就提交。

时间:2022-11-22 14:46:25
    需要在输入完成后,焦点离开时才进行数据验证,主要代码如下:
这种方法在正常情况下是没问题,但如果是通过Tab键离开时,发现OnValidating执行是在数据提交之后才进行的。
不知是否有什么好的方法?
    public class KDataGridViewNumberBoxEditingControl : TextBox, IDataGridViewEditingControl
    {
        ... ...
        
        protected override void OnValidating(CancelEventArgs e)
        {
            base.OnValidating(e);
            
            if (CheckDataValidate())
            {
                e.Cancel = true;
                return;
            }

            //通知DataGridView值发生变化了
            NotifyDataGridViewOfValueChange();
        }

        //检查数据有效性
bool CheckDataValidate()
{
    ... ...
}
    }

7 个解决方案

#1


那在 Lose_Focous 里面写好了。

#2


Lose_Focous也不行,如果按Tab离开时也是执行在Cell取值之后,此时当Cell取值时,GridViewEditingControl还没有提交值。
Net自带的NumericUpDown有个OnValueChanged方法,不知它这个方法时如何做的,就是要它这个效果。
而TextBox只有OnTextChanged方法,但这个每输一个字符都会触发,我要的效果是当输入完离开时才触发。
可否提供类似NumericUpDown的OnValueChanged方法如何在TextBox中如何实现?

#3


有知道的吗?

#4


这个应该用leave事件,这个是失去焦点时才触发的事件

#5


學習

#6


leave也不行,也是在后执行。
最后还是自己解决了,就是在Cell中加入给DataGridView加入CellValidating事件,然后调用EditingControl中的检测方法。

#7


方法如下:
        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);

            if (this.DataGridView != null)
            {
                KDataGridViewNumberBoxEditingControl ctl = DataGridView.EditingControl as KDataGridViewNumberBoxEditingControl;

                if (ctl != null)
                {
                    ctl.Value = this.Value;
                }

                this.DataGridView.CellValidating += new DataGridViewCellValidatingEventHandler(DataGridView_CellValidating);
            }
        }

        void DataGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
        {
            if (this.DataGridView != null)
            {
                KDataGridViewNumberBoxEditingControl ctl =
                DataGridView.EditingControl as KDataGridViewNumberBoxEditingControl;
                if (ctl != null)
                {
                    if (!ctl.CheckValidate())
                        e.Cancel = true;
                }
            }
        }

        /// <summary>
        /// 编辑任务结束后就不需要编辑控件了,此时表格控件调用该方法。
        /// </summary>
        public override void DetachEditingControl()
        {
            if (this.DataGridView != null)
            {
                KDataGridViewNumberBoxEditingControl ctl = DataGridView.EditingControl as KDataGridViewNumberBoxEditingControl;
                if (ctl != null)
                {
                    ctl.ClearUndo();
                }

                this.DataGridView.CellValidating -= new DataGridViewCellValidatingEventHandler(DataGridView_CellValidating);
            }

            base.DetachEditingControl();
        }

#1


那在 Lose_Focous 里面写好了。

#2


Lose_Focous也不行,如果按Tab离开时也是执行在Cell取值之后,此时当Cell取值时,GridViewEditingControl还没有提交值。
Net自带的NumericUpDown有个OnValueChanged方法,不知它这个方法时如何做的,就是要它这个效果。
而TextBox只有OnTextChanged方法,但这个每输一个字符都会触发,我要的效果是当输入完离开时才触发。
可否提供类似NumericUpDown的OnValueChanged方法如何在TextBox中如何实现?

#3


有知道的吗?

#4


这个应该用leave事件,这个是失去焦点时才触发的事件

#5


學習

#6


leave也不行,也是在后执行。
最后还是自己解决了,就是在Cell中加入给DataGridView加入CellValidating事件,然后调用EditingControl中的检测方法。

#7


方法如下:
        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);

            if (this.DataGridView != null)
            {
                KDataGridViewNumberBoxEditingControl ctl = DataGridView.EditingControl as KDataGridViewNumberBoxEditingControl;

                if (ctl != null)
                {
                    ctl.Value = this.Value;
                }

                this.DataGridView.CellValidating += new DataGridViewCellValidatingEventHandler(DataGridView_CellValidating);
            }
        }

        void DataGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
        {
            if (this.DataGridView != null)
            {
                KDataGridViewNumberBoxEditingControl ctl =
                DataGridView.EditingControl as KDataGridViewNumberBoxEditingControl;
                if (ctl != null)
                {
                    if (!ctl.CheckValidate())
                        e.Cancel = true;
                }
            }
        }

        /// <summary>
        /// 编辑任务结束后就不需要编辑控件了,此时表格控件调用该方法。
        /// </summary>
        public override void DetachEditingControl()
        {
            if (this.DataGridView != null)
            {
                KDataGridViewNumberBoxEditingControl ctl = DataGridView.EditingControl as KDataGridViewNumberBoxEditingControl;
                if (ctl != null)
                {
                    ctl.ClearUndo();
                }

                this.DataGridView.CellValidating -= new DataGridViewCellValidatingEventHandler(DataGridView_CellValidating);
            }

            base.DetachEditingControl();
        }