我有一个包含多个列的DataGridView,包括按钮和组合框。我正在尝试实现一个验证,当DataGridView失去焦点并且这按预期工作时触发。但是,当从DataGridView中的Text列移动到非Text(按钮,组合框)列时,也会触发相同的验证。
有没有人对如何解决此问题有任何建议?我尝试了各种可能的解决方案,但未能完全解决问题。
以下是我的事件处理程序和事件处理程序初始化程序的代码:
初始化器:
dgvCopy.LostFocus += dgvCopy_LostFocus;
事件处理程序:
private void dgvCopy_LostFocus(object sender, EventArgs e) {
if (dgvCopy.SelectedRows.Count > 0) {
if (dgvCopy.SelectedRows[0].Cells["Type"].Value == null) {
MessageBox.Show("Please choose a type");
txtCopyText.Enabled = false;
}
else {
txtCopyText.Enabled = true;
}
}
非常感谢任何帮助或建议!
答案 0 :(得分:1)
您可以使用Validating
事件代替LostFocus
当单元格的编辑控件显示时,LostFocus
也会触发,Validating
仅在DataGridView
不再对表单进行活动控制时或在ValidateChildren
上调用Form
时触发{1}}。
void dataGridView1_Validating(object sender, CancelEventArgs e)
{
//Perform Validation Here
}
请注意,只有当新活动控件的DataGridView
属性设置为true时,才会在Validating
CausesValidation
触发时离开。
因此,根据您的要求,您可能希望使用Leave
事件。
答案 1 :(得分:1)
嵌套控件时,应将每个嵌套控件上的CausesValidation
属性设置为false,然后使用Validating
事件覆盖LostFocus
事件来验证数据,然后{ {1}}事件继续成功。如果您希望焦点更改触发非验证事件,并且您希望它通过嵌套层次结构进行更新,则应考虑使用Validated
而不是Leave
,因为LostFocus非常接近金属并且句柄包含控件。