这是一个WinForm C#问题。 我有一个验证事件侦听器的文本框来验证文本框的对正则表达式的内容。
确认后,如果输入的数值是不妥当的,我显示的消息框,我取消该事件,使鼠标光标移动回其具有不当值的文本框中。
当我从文本框移动到其他按钮/文本框这是工作的罚款。
但是,当我输入不正确的值并关闭表单(与右上角的关闭按钮),它验证文本框内容,并引发了消息框,并因为我cacelling活动形式亘古不密切。
问题是,当我点击窗体的右上角的X按钮,我不想验证,因为我反正关闭窗体被解雇。 我怎样才能做到这一点?
我将尽快张贴代码段。
Answer 1:
要使用以下验证处理程序,如“txtIPAddress_Validating()”处理程序,同时能够关闭表单,而无需输入有效的条目这样做,我做到以下几点:
1)Initate确认处理程序:从控制的控制性能要激活验证的,从这个控制事件列表中双击“验证”事件。 控制事件列表可以通过点击此控件的属性表的事件(闪电看)工具栏按钮访问。 然后,您可以在自动生成的处理程序与名称合并控制的名字,同时也是“_Validating”输入代码。 这个处理程序,其中一些被确定为无效,可以通过添加“e.Cancel =真正的”指令强制有效条目的一部分。
对于这样的验证方法的实例,参见“txtIPAddress_Validating()”和“txtMaskBits_Validating()”下面的代码。 不要被这些具体示例的完整验证机制分心。 所有你需要看到在自己的代码复制,以迫使验证是在你自己的验证方法的正确的地方添加“e.Cancel =真正的”指令。 当值被确定为无效的。
在这一点上验证应该工作正常,但任何试图关闭窗体会触发验证,这将停止,并能够关闭表前,坚持为有效值。 这并不总是你想要的。 如果不是这样,我继续下面的。
2)“取消”按钮也会取消(禁用)的所有验证:
a)将其相关联的方法,如“btnCancel_Click()”下面方法的形式定期“取消”按钮。
b)在常规 'this.close();' 指令,添加 'AutoValidate = AutoValidate.Disable;' 指令。 该指令禁止所有的“验证”触发器。 请注意,任何验证正在发生前的“btnCancel_Click”事件被触发。 事实并非如此为将确认事件之后的所有执行表单关闭事件。 这就是为什么验证无法从这些表格关闭事件被禁用。
c)对于这个“取消”按钮才能正常工作,你还需要设置这个“取消”按钮为“假”的“的CausesValidation”属性。 这是必要的,在此按钮上点击,否则确认(validate)可以通过上述被禁止之前将触发验证“AutoValidate = AutoValidate.Disable;” 指令。
此时,你应该能够通过点击“取消”按钮,无需先输入有效的值退出。 然而,点击右上角的“X”形式的窗口的按钮依旧会迫使验证。
3)充分利用右上角的“X”按钮也会取消验证:
这里的挑战是要捕获这样的“X”执行验证之前点击事件。 任何企图通过表单期末处理这样做是行不通的,因为它是那么为时已晚,一旦执行到达这样的处理。 然而,“X”按钮的点击,可以迅速通过重写的WndProc()方法和测试一个“m.Msg == 0x10的”条件捕获。 当该条件为真,先前介绍“AutoValidate = AutoValidate.Disable;” 指令可以再次使用在这种情况下禁用整体审定及。 参阅下面的这种方法的代码示例的WndProc()方法。 你应该能够复制和粘贴的方法是在你的窗体类。
在这一点上,无论是“取消”的“X”按钮应该取消valdations。 然而,可以用来关闭窗体Esc键没有。 当窗体的“CancelButton”属性用于该ESC键链接到表单的“取消”按钮,这样的退出键被激活。
4)使ESC键也取消验证:
类似于“X”键,ESC键可以通过覆盖来EXISTINGMETHOD抓获。 这是ProcessDialogKey()方法。 一个更多的时间,先前介绍“AutoValidate = AutoValidate.Disable;” 指令可以用来禁用整体验证了ESC键也是如此。 请参阅下面的代码的“ProcessDialogKey()”覆盖方法,看看如何可以做到这一点。 在这里,你应该能够复制和粘贴的方法是在你自己的窗体类。
此时,你应该做的!
进一步考虑:
这是好事,注意以下两个其他的方法来关闭该窗口也应该在这一点上正常工作。 这两种方法是:
- 左上角窗口图标按钮的“关闭”选项。
- 按下Alt + F4,其触发相同的关闭动作与上述“关闭”选项。
这两个关闭窗口的方式开始也取消验证,一旦你介绍了上面第3点中描述的“X”键捕获机制。
这是为了我这个至今。 希望这有助于!
我下面的代码示例:
public partial class frmMyIP : Form
{
public frmMyIP()
{
InitializeComponent();
}
// To capture the Upper right "X" click
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x10) // The upper right "X" was clicked
{
AutoValidate = AutoValidate.Disable; //Deactivate all validations
}
base.WndProc(ref m);
}
// To capture the "Esc" key
protected override bool ProcessDialogKey(Keys keyData)
{
if (keyData == Keys.Escape)
{
AutoValidate = AutoValidate.Disable;
btnCancel.PerformClick();
return true;
}
return base.ProcessDialogKey(keyData);
}
public bool IsValidIP(string ipaddr)
{
string pattern = @"^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])"+
@"(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$";
Regex check = new Regex(pattern);
bool valid = false;
if (ipaddr == "")
{
valid = false;
}
else
{
valid = check.IsMatch(ipaddr, 0);
}
return valid;
}
private void txtIPAddress_Validating(object sender, CancelEventArgs e)
{
string address = txtIPAddress.Text;
if (!IsValidIP(address))
{
MessageBox.Show("Invalid IP address!");
e.Cancel = true;
}
}
private void cmbMaskBits_Validating(object sender, CancelEventArgs e)
{
int MaskBitsValue = Convert.ToInt32(cmbMaskBits.Text);
if (MaskBitsValue<1 || MaskBitsValue>30)
{
MessageBox.Show("Please select a 'Mask Bits' value between 1 and 30!");
e.Cancel = true;
}
}
private void btnCancel_Click(object sender, EventArgs e)
{
// Stop the validation of any controls so the form can close.
// Note: The CausesValidation property of this <Cancel> button
// must also be set to false.
AutoValidate = AutoValidate.Disable;
this.Close();
}
Answer 2:
private void Form1_FormClosing(object sender, FormClosingEventArgs e) {
// Assume that X has been clicked and act accordingly.
}
创建一个关闭事件,后来干脆取消您的验证。
Answer 3:
插入以下为在文本框中的验证事件的第一行:
//Allow the form to be closed
if (this.ActiveControl.Equals(sender))
return;
由于形式的密切事件被触发验证和因为这将(通常至少)是唯一的形式,事件会触发验证,我们可以作一个假设,任何形式的事件触发验证是关闭事件。
Answer 4:
相比,这里所有的建议,其中涉及黑客和额外多余的代码撤消一些实际的答案是可笑的简单。
该“绝招”仅仅是允许焦点变化,而不是火从按钮验证表单本身。
你可以简单地设置窗体上的两个属性:
MyForm.CausesValidation = false;
MyForm.AutoValidate = AutoValidate.EnableAllowFocusChange;
等瞧,当你试图将其关闭,并验证仍然有效以下其他投入,如标签改变焦点或鼠标点击的形式垂直作用。
Answer 5:
尝试设置CauseValidation
为假
或在这里看到: 如何点击窗体的取消按钮后跳过验证
或尝试的FormClosing事件设置此
private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
// CauseValidation to false or check
}
Answer 6:
你需要的是像下面所描述的,它假定你有一个保存按钮和形式的取消按钮的实现:
public Form1()
{
// Disable validation in constructor
textBox.CausesValidation = false;
}
private void OnSaveClicked(object sender, EventArgs e)
{
textBox.CausesValidation = true;
if (ValidateChildren())
{
//
// Do saving of the form data or other processing here ....
//
Close();
}
//
// Set validation to false, as user may press Cancel next
//
textBox.CausesValidation = false;
}
private void OnCancelClicked(object sender, EventArgs e)
{
Close();
}
Answer 7:
检查哪个按钮集中在验证检查。 如果取消按钮(在我的情况下,清除按钮),覆盖。 这是一种内在的方法,我从我的手机验证事件处理程序调用。 (刚刚意识到这是一个C#的问题,但你可以翻译)
Private Sub validateCell(ByVal tagDesc As String, ByVal userInput As String, ByVal legalRegex As String, ByVal regexDesc As String, ByVal e As DataGridViewCellValidatingEventArgs)
Dim match As Match = Regex.Match(userInput, legalRegex)
Dim matches = match.Groups()
Dim val = match.Value
If val.Length = 0 Or userInput.Length > val.Length Then
tagGrid.Rows(e.RowIndex).ErrorText = _
tagDesc & " must match pattern: " & regexDesc
If Me.Cancel_Button.Focused Or Me.clearButton.Focused Then
e.Cancel = False
tagGrid.Rows(e.RowIndex).ErrorText = ""
Else
e.Cancel = True
MsgBox(tagDesc & " must match pattern: " & regexDesc, MsgBoxStyle.Critical)
End If
Else
e.Cancel = False
tagGrid.Rows(e.RowIndex).ErrorText = ""
End If
End Sub
Answer 8:
我来到这里寻找一个简单的方法来造成一种形式时关闭一个验证事件处理程序引发了异常,报告它,并且需要强制的形式关闭。 阅读本主题和无数人,其次是试验的一个下午后,我已经取得了一些发现,并制定了简单的黑客强制的形式关闭。
首先第一件事情,虽然, 我发现,当一个验证事件调用this.Close()传递到其From_Closing事件过程FormClosingEventArgs.Cancel标志设置为TRUE,有效地导致事件取消本身。 相反,正常关闭事件接收FormClosingEventArgs.Cancel标志设置为false。
由于形态上的关闭方法不带任何参数,没有直接的办法迫使问题,从而引发了需要一个黑客。 本文讨论了一些这样的黑客,但我认为我是非常容易实现。
黑客开始用一个简单的表格水平布尔变量。
bool _fExceptionIsFatal = false;
除了定义Form_Closing事件处理程序,这是需要形式的唯一结构性变化。
该Form_Closing事件很简单。
private void From1_Closing ( object sender , FormClosingEventArgs e )
{
if (this.CausesValidation )
{ // There is no sense repeating this procedure if another routine already did it.
DisableValidation ( );
} // if (this.CausesValidation )
if ( _fExceptionIsFatal )
{ // Cancel False == Allow form to close.
e.Cancel = false;
} // if ( _fExceptionIsFatal )
} // From1_Closing
虽然DisableValidation作为当前的形式的本地方法来实现,同样的事情也可能通过将窗体的引用到库程序,因为一个表单的形式完成的,其Controls集合是一个控件集合,期。 不久,我就这样做,以实现其逆,启用验证再次一起。
private void DisableValidation ( )
{
foreach ( Control ctrl in this.Controls )
{
ctrl.CausesValidation = false;
} // foreach ( Control ctrl in this.Controls )
this.CausesValidation = false;
} // DisableValidation
第四片的溶液,是非常简单; 每当要强制形式关闭,_intValueAsInteger设置为TRUE调用this.Close之前。
Answer 9:
添加下面的代码到表单中。 您可以关闭连孩子控件验证表单。
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x10) // The upper right "X" was clicked
{
this.ActiveControl = null;
this.AutoValidate = AutoValidate.Disable;
}
base.WndProc(ref m);
}
文章来源: Closing the C# windows form by avoiding textbox validation