这种方法在正常情况下是没问题,但如果是通过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中如何实现?
Net自带的NumericUpDown有个OnValueChanged方法,不知它这个方法时如何做的,就是要它这个效果。
而TextBox只有OnTextChanged方法,但这个每输一个字符都会触发,我要的效果是当输入完离开时才触发。
可否提供类似NumericUpDown的OnValueChanged方法如何在TextBox中如何实现?
#3
有知道的吗?
#4
这个应该用leave事件,这个是失去焦点时才触发的事件
#5
學習
#6
leave也不行,也是在后执行。
最后还是自己解决了,就是在Cell中加入给DataGridView加入CellValidating事件,然后调用EditingControl中的检测方法。
最后还是自己解决了,就是在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();
}
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中如何实现?
Net自带的NumericUpDown有个OnValueChanged方法,不知它这个方法时如何做的,就是要它这个效果。
而TextBox只有OnTextChanged方法,但这个每输一个字符都会触发,我要的效果是当输入完离开时才触发。
可否提供类似NumericUpDown的OnValueChanged方法如何在TextBox中如何实现?
#3
有知道的吗?
#4
这个应该用leave事件,这个是失去焦点时才触发的事件
#5
學習
#6
leave也不行,也是在后执行。
最后还是自己解决了,就是在Cell中加入给DataGridView加入CellValidating事件,然后调用EditingControl中的检测方法。
最后还是自己解决了,就是在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();
}
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();
}