在下面的小应用程序中,我想知道为什么从未调用 BtnOk_Validating 事件处理程序。我预计单击“确定”按钮会调用事件处理程序。
真实的对话框有更多的控件,每个控件都有一个验证事件处理程序。我的计划是使用“确定”按钮验证事件处理程序,在允许对话框关闭之前调用每个其他事件处理程序。
如果不是很明显,那么我在表单开发方面还是个新手。
using System.ComponentModel;
using System.Windows.Forms;
namespace ConsoleApp
{
class Program
{
static void Main( string[] args )
{
Dialog dialog = new Dialog();
dialog.ShowDialog();
}
}
public class Dialog : Form
{
Button m_BtnOk;
Button m_BtnCancel;
public Dialog()
{
m_BtnOk = new System.Windows.Forms.Button();
m_BtnCancel = new System.Windows.Forms.Button();
m_BtnOk.CausesValidation = true;
m_BtnOk.DialogResult = DialogResult.OK;
m_BtnOk.Text = "Ok";
m_BtnOk.Location = new System.Drawing.Point( 0, 0 );
m_BtnOk.Size = new System.Drawing.Size( 70, 23 );
m_BtnOk.Validating += new CancelEventHandler( BtnOk_Validating );
m_BtnCancel.CausesValidation = false;
m_BtnCancel.DialogResult = DialogResult.Cancel;
m_BtnCancel.Text = "Cancel";
m_BtnCancel.Location = new System.Drawing.Point( 0, 30 );
m_BtnCancel.Size = new System.Drawing.Size( 70, 23 );
Controls.Add( this.m_BtnOk );
Controls.Add( this.m_BtnCancel );
}
private void BtnOk_Validating( object sender, CancelEventArgs e )
{
System.Diagnostics.Debug.Assert( false ); // we never get here
}
}
}
编辑:请参阅我的后续内容question https://stackoverflow.com/questions/5435366/how-to-implement-control-validation-in-a-winforms-application一个更完整的例子(大部分情况下)。
这是因为按钮永远不会失去焦点,因为它是唯一的控件。如果您添加一个TextBox
或者可以占据按钮焦点的东西,然后你会看到它被触发。
From MSDN http://msdn.microsoft.com/en-us/library/system.windows.forms.control.validating.aspx
当您使用键盘(TAB、SHIFT+TAB 等)、调用 Select 或 SelectNextControl 方法或将 ContainerControl.ActiveControl 属性设置为当前窗体来更改焦点时,焦点事件按以下顺序发生:
Enter
GotFocus
Leave
Validating
Validated
LostFocus
当您使用鼠标或调用 Focus 方法更改焦点时,焦点事件按以下顺序发生:
Enter
GotFocus
LostFocus
Leave
Validating
Validated
如果 CausesValidation 属性设置为 false,则抑制 Validating 和 Validated 事件。
更新:就像汉斯提到的那样,您需要将所有其他控件的每个验证事件中所做的验证提取到单独的函数中。然后你可以创建一个ValidateAll
函数来检查所有值。如果函数返回false
,那么你就不要关闭Form
。如果返回的话true
,你打电话给this.Close()
。所以它可能看起来像这样:
// pseudo code
textbox1.Validating += ValidateTx1();
textbox2.Validating += ValidateTx2();
btnOk.Click += OkBtnClicked();
private void OkBtnClicked(...)
{
if(ValidateAll())
{
this.Close();
}
}
private bool ValidateTx1(...)
{
DoTx1Validation();
}
private bool ValidateTx2(...)
{
DoTx2Validation();
}
private bool ValidateAll()
{
bool is_valid = DoTx1Validation();
return (is_valid && DoTx2Validation());
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)