Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 关闭表单时触发DataGridView CellValidated事件_C#_Winforms_Datagridview - Fatal编程技术网

C# 关闭表单时触发DataGridView CellValidated事件

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

情况: 我已经在表单上放置了DataGridView。在DataGridView对象中,我对一些单元格进行检查,例如,如果用户输入的金额不大于100。当用户使用Enter、Tab或箭头键离开单元格时,将执行检查

问题: 一切正常,但当光标位于单元格中且值大于100且用户按下表单上的“X”按钮(关闭按钮)时,仍会显示消息

问题: 当用户单击表单上的X按钮时,如何防止MessageBox出现

代码示例:

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。你的解决方案合适。