c# – 如何在Windows窗体应用程序中实现控件验证?

c# – 如何在Windows窗体应用程序中实现控件验证?,第1张

概述我试图更好地了解验证如何在 Windows窗体应用程序中工作.互联网上充满了琐碎的例子,但我找不到一个解释控制验证的非平凡的例子.无论如何,多亏了 SwDevMan81和 Hans Passant,我从一个比昨天更好的地方开始. “真正的应用程序”有一个包含许多TextBox控件的对话框.每个控件都实现Validating事件.正如您在示例中所看到的,ValidateChildren由于Click 我试图更好地了解验证如何在 Windows窗体应用程序中工作.互联网上充满了琐碎的例子,但我找不到一个解释控制验证的非平凡的例子.无论如何,多亏了 SwDevMan81和 Hans Passant,我从一个比昨天更好的地方开始.

“真正的应用程序”有一个包含许多TextBox控件的对话框.每个控件都实现Validating事件.正如您在示例中所看到的,ValidateChildren由于Click事件而被调用,导致ValIDating事件被发送到每个控件.该应用程序还使用ErrorProvider控件来提供用户反馈.昨天,我不明白如何使用Ok按钮Click事件来执行此验证.今天,我的对话框按预期工作.单击“确定”按钮会导致ErrorProvIDer执行控件无效且对话框未意外关闭的 *** 作.

因此,虽然这似乎有效,但我感觉我“在线外”.在windows窗体应用程序中是否有用于控制验证的“最佳实践”文档/站点?

在许多令我困惑的事情中,当Ok按钮DialogResult属性设置为返回DialogResult.OK时,我无法找到对话框行为的解释.为什么设置此属性会干扰验证? (尝试使用和不使用该行的示例,看看我的意思.)

我昨天遇到的问题(看起来似乎)主要源于不了解ValIDateChildren方法以及我将Ok按钮DialogResult属性设置为DialogResult.OK.将此属性设置为DialogResult.None似乎更改了Form类的一些自动行为.

TIA

using System;using System.ComponentModel;using System.windows.Forms;namespace ConsoleApp{    class Program    {        static voID Main( string[] args )        {            Dialog dialog = new Dialog();            if( dialog.ShowDialog() == DialogResult.OK )                Console.Beep();        }    }    public class Dialog : Form    {        TextBox m_TextBox0;        TextBox m_TextBox1; // not valIDated        TextBox m_TextBox2;        button m_OkBtn;        button m_CancelBtn;        ErrorProvIDer m_ErrorProvIDer;        public Dialog()        {            m_TextBox0 = CreateTextBox( 0,"TextBox 0" );            m_TextBox1 = CreateTextBox( 1,"TextBox 1" );            m_TextBox2 = CreateTextBox( 2,"TextBox 2" );            m_OkBtn     = Createbutton( 3,"Ok" );            m_CancelBtn = Createbutton( 4,"Cancel" );            m_ErrorProvIDer = new ErrorProvIDer( this );            //m_BtnOk.DialogResult = DialogResult.OK;            m_OkBtn.Click += new EventHandler( BtnOk_Click );            m_OkBtn.CausesValIDation = true;            m_CancelBtn.DialogResult = DialogResult.Cancel;            m_CancelBtn.CausesValIDation = false;        }        voID BtnOk_Click( object sender,EventArgs e )        {            if( ValIDateChildren() )            {                DialogResult = DialogResult.OK;                Close();            }        }        voID TextBox_ValIDating( object sender,CancelEventArgs e )        {            m_ErrorProvIDer.Clear();            TextBox textBox = sender as TextBox;            // m_TextBox1 is always valID,the others are valID if they have text.            bool valID = textBox.TabIndex == 1 || textBox.Text.Length > 0;            if( !valID )                m_ErrorProvIDer.SetError( textBox,"Error " + textBox.name );            e.Cancel = !valID;        }        button Createbutton( int index,string name )        {            button button = new button();            button.TabIndex = index;            button.Text = name;            button.Location = new System.Drawing.Point( 0,index * 30 );            Controls.Add( button );            return button;        }        TextBox CreateTextBox( int index,string name )        {            Label label = new Label();            label.Text = name;            label.Location = new System.Drawing.Point( 0,index * 30 );            TextBox textBox = new TextBox();            textBox.TabIndex = index;            textBox.CausesValIDation = true;            textBox.ValIDating += new CancelEventHandler( TextBox_ValIDating );            textBox.Location = new System.Drawing.Point( 100,index * 30 );            Controls.Add( label );            Controls.Add( textBox );            return textBox;        }    }}

编辑:这是最终的解决方案.我认为它很容易使用,同时也满足所有其他要求.我提前道歉这个问题到底有多长时间了.如果我可以向您展示所有真正的应用程序,那么为什么这么重要会更有意义.无论如何,感谢帮助这只老狗学习新技巧.

答案是为每个需要验证的控件创建一个ErrorProvIDer(相对于整个对话框的一个ErrorProvIDer.之后,一切都非常简单.

using System;using System.ComponentModel;using System.windows.Forms;namespace ConsoleApp{    class Program    {        static voID Main( string[] args )        {            Dialog dialog = new Dialog();            if( dialog.ShowDialog() == DialogResult.OK )                Console.Beep();        }    }    public class CompositeControl    {        Label         m_Label;        TextBox       m_TextBox;        ErrorProvIDer m_ErrorProvIDer;        Dialog m_Dialog;        public CompositeControl( int index,string name,Dialog dialog )        {            m_Label = new Label();            m_Label.Text = name;            m_Label.Location = new System.Drawing.Point( 0,index * 30 );            m_TextBox = new TextBox();            m_TextBox.TabIndex = index;            m_TextBox.CausesValIDation = true;            m_TextBox.ValIDating += new CancelEventHandler( TextBox_ValIDating );            m_TextBox.Location = new System.Drawing.Point( 100,index * 30 );            m_Dialog = dialog;            m_ErrorProvIDer = new ErrorProvIDer( m_Dialog );            m_Dialog.Controls.Add( m_Label );            m_Dialog.Controls.Add( m_TextBox );        }        voID TextBox_ValIDating( object sender,CancelEventArgs e )        {            TextBox textBox = sender as TextBox;            if( !m_Dialog.IsClosing && textBox.Text.Length == 0 )                return;            // m_TextBox1 is always valID,"Error " + textBox.name );            else                m_ErrorProvIDer.Clear();            e.Cancel = !valID;        }    }    public class Dialog : Form    {        CompositeControl m_CompositeControl0;        CompositeControl m_CompositeControl1; // not valIDated        CompositeControl m_CompositeControl2;        button m_OkBtn;        button m_CancelBtn;        bool m_IsClosing = false;        public Dialog()        {            m_CompositeControl0 = new CompositeControl( 0,"TextBox 0",this );            m_CompositeControl1 = new CompositeControl( 1,"TextBox 1",this );            m_CompositeControl2 = new CompositeControl( 2,"TextBox 2",this );            m_OkBtn     = Createbutton( 3,"Cancel" );            //m_BtnOk.DialogResult = DialogResult.OK;            m_OkBtn.Click += new EventHandler( BtnOk_Click );            m_OkBtn.CausesValIDation = true;            m_CancelBtn.DialogResult = DialogResult.Cancel;            m_CancelBtn.CausesValIDation = false;        }        voID BtnOk_Click( object sender,EventArgs e )        {            m_IsClosing = true;            if( ValIDateChildren() )            {                DialogResult = DialogResult.OK;                Close();            }            m_IsClosing = false;        }        button Createbutton( int index,index * 30 );            Controls.Add( button );            return button;        }        public bool IsClosing { get { return m_IsClosing; } }    }}

这个问题是我昨天问到的one的后续问题.

解决方法 分配DialogResult属性是使对话框关闭的原因.它在设置为None时保持运行.您不需要Close()调用.调用ShowDialog()的代码获取您指定为返回值的DialogResult值.因此它知道对话框是否已关闭,或者是否已取消.

另请注意,编写验证事件处理程序的方式不需要ValIDateChildren().您设置e.Cancel = true以防止用户离开文本框.这意味着当文本框被验证为正常时,她只能进入“确定”按钮.但是,您必须确保在显示对话框时首先选择具有验证的控件.

一个友好的对话框是用户可以在控件之间自由选项并选择“简单”的对话框.您现在需要两个验证,一个验证输入的值是否有效,另一个验证是否没有丢失值.您可以通过在ValIDation事件处理程序中接受空字符串来获得此结果.但Winforms不能很好地支持后者,你需要代码.

总结

以上是内存溢出为你收集整理的c# – 如何在Windows窗体应用程序中实现控件验证?全部内容,希望文章能够帮你解决c# – 如何在Windows窗体应用程序中实现控件验证?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1216675.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存