C# 关闭表单时触发DataGridView CellValidated事件
情况: 我已经在表单上放置了DataGridView。在DataGridView对象中,我对一些单元格进行检查,例如,如果用户输入的金额不大于100。当用户使用Enter、Tab或箭头键离开单元格时,将执行检查 问题: 一切正常,但当光标位于单元格中且值大于100且用户按下表单上的“X”按钮(关闭按钮)时,仍会显示消息 问题: 当用户单击表单上的X按钮时,如何防止MessageBox出现 代码示例:C# 关闭表单时触发DataGridView CellValidated事件,c#,winforms,datagridview,C#,Winforms,Datagridview,情况: 我已经在表单上放置了DataGridView。在DataGridView对象中,我对一些单元格进行检查,例如,如果用户输入的金额不大于100。当用户使用Enter、Tab或箭头键离开单元格时,将执行检查 问题: 一切正常,但当光标位于单元格中且值大于100且用户按下表单上的“X”按钮(关闭按钮)时,仍会显示消息 问题: 当用户单击表单上的X按钮时,如何防止MessageBox出现 代码示例: private void dgv_CellValidated(object sender, Da
private void dgv_CellValidated(object sender, DataGridViewCellEventArgs e)
{
try
{
const int nColumn = 2;
if (!e.ColumnIndex.Equals(nColumn))
{
return;
}
if (e.ColumnIndex.Equals(nColumn))
{
double nMengeSource;
double.TryParse(dgv.Rows[e.RowIndex].Cells[fldMenge.Name].Value.ToString(),
out nMengeSource);
double nMengeLos;
double.TryParse(dgv.Rows[e.RowIndex].Cells[fldMengeLos.Name].Value.ToString(),
out nMengeLos);
// prüfe ob erfasste Menge die Menge im Los überschreitet
if (nMengeSource > nMengeLos)
{
var sMsg = String.Empty;
sMsg += "Warning! Value is greather than allowed!";
MessageBox.Show(sMsg, "Check...", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
}
catch (Exception ex)
{
Dialog.SetDefaultCursor();
MessageBox.Show(MethodBase.GetCurrentMethod().Name + @"\n\n" + ex + @"\n\n" + ex.Message);
}
}
单击X时,DataGridViewCell
会失去焦点,从而触发单元格上的验证。您希望取消显示,但仅当表单
关闭时。但是,您不能在Form.FormClosing
中执行此操作,因为它是在验证发生后激发的。但您可以使用以下方法进行操作:
protected override void WndProc(ref Message m)
{
switch (((m.WParam.ToInt64() & 0xffff) & 0xfff0))
{
case 0xf060:
this.dataGridView1.CausesValidation = false;
break;
}
base.WndProc(ref m);
}
另一种方法是:
protected override void WndProc(ref Message m)
{
if(m.Msg == 0x0010)
this._dataGridView1.CausesValidation = false;
base.WndProc(ref m);
}
我认为答案中的0xffff是多余的。你也可以这样做:
switch (m.WParam.ToInt64() & 0xfff0)
你为什么要这么做?该值是否仍将被存储,它是否仍然无效?如果用户单击“X”,我不想再验证该值。表单上还有另一个名为“保存”的按钮-如果用户单击表单上的“X”按钮,他不想保存输入的值。。。“X”应该被解释为“取消”…谢谢你,Ohse。你的解决方案合适。