为什么我的按钮的“验证”事件处理程序从未被调用?

2024-02-29

在下面的小应用程序中,我想知道为什么从未调用 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(使用前将#替换为@)

为什么我的按钮的“验证”事件处理程序从未被调用? 的相关文章

随机推荐

  • Akka TestProbe 测试 context.watch() / 终止处理

    我正在使用 TestKit 测试 akka 系统 我正在测试的系统的一个参与者在收到某种消息类型后 context watches 发送者 并在发送者死亡时自杀 trait Handler extends Actor override de
  • Eclipse 将项目中的所有文件视为派生文件

    我在 Eclipse 工作区中创建了一个动态 Web 项目 它也是一个 Maven 项目 并受 SVN 控制 但在 打开资源 Ctrl Alt R 中 不会出现该项目中的文件 除非我从窗口的选项 右上角下拉菜单 显示派生资源 中进行检查 我
  • Android openGL 示例显示空白屏幕

    我刚刚在 Galaxy s3 上尝试了来自developer android com 的原始 Open GL 示例代码 它给我的只是一个空白屏幕 我更改了透明颜色并且屏幕背景发生了变化 但我仍然看不到代码所示的任何三角形或正方形 为了验证
  • LINQ to SQL C# 中的 SELECT COUNT

    如何使用 COUNT 编写 LINQ to SQL Example var purch from purchase in myBlaContext purchases select purchase 我怎样才能在这里得到计数 像那样 var
  • noexcept、继承构造函数以及对实际完整的不完整类型的无效使用

    我不确定这是否是一个错误GCC编译器或预期的行为noexcept 考虑以下示例 struct B B int noexcept virtual void f 0 struct D public B using B B D noexcept
  • facet_grid 中的多行

    我有一个数据集 大致如下所示 names tibble NAME 2 c Location1 Location2 Location3 Location4 dates tibble date seq as Date 2015 01 01 as
  • 字体在 iPhone 上的位置?

    我正在 iPhone 项目中使用 FreeType2 库 并且如果可能的话 我尝试简单地从系统加载 TTF 文件 FT Library library FT Face face int error error FT Init FreeTyp
  • 省略 xstream 中的 xml 声明

    我想使用 xstream 将内容附加到 xml 但每次运行时都使用 xstream toXml obj writer 它会向内容添加 xml 声明 我们可以在 xstream 中省略 xml 声明吗 我刚刚遇到这个问题 使用 XStream
  • 如何在 Javascript 中将数组转换为对象数组[重复]

    这个问题在这里已经有答案了 我想转换一个数组 如 John Jane 放入对象对数组中 如下所示 name John name Jane 请帮助我这样做 尝试数组中的 map 函数 const output John Jane map na
  • 使用 Selenium 验证

    我需要验证网页上的特定插槽是否已加载 我正在使用 Selenium WebDrivermain 函数 我应该使用 JUnit 测试用例吗 在任意对象之间检索文本的方法有哪些 div 有具体的id吗 如果给定这一页 http ideone c
  • R:为文字云图形/png添加标题

    我有一些有效的 R 代码 可以从术语文档矩阵生成标签云 现在 我想从许多文档创建一大堆标签云 并在稍后进行可视化检查 要知道标签云图片属于哪个文档 语料库 我想为生成的图形添加标题 我怎么做 也许这是显而易见的 但我仍然是 R 图形的初学者
  • DNS 与 GKE 内部负载均衡器

    我在 GKE 上有两个 kubernetes 集群 一个公共集群处理与外界的交互 另一个私有集群仅供内部使用 公共集群需要访问私有集群上的一些服务 我已通过以下方式将这些服务暴露给公共集群的 Pod内部负载均衡器 https cloud g
  • 为后台线程配置 Autofac 容器

    我有一个 asp net MVC 站点 其中有许多使用 InstancePerHttpRequest 范围注册的组件 但是我还有一个 后台任务 它将每隔几个小时运行一次 但不会有 httpcontext 我想获得一个已像这样注册的 IRep
  • 我可以对隐私网址做什么? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试将我的 Android 应用程序投放市场 而我最不需要的就是隐私 URL 问题是我没有网站
  • 对嵌套数组进行排序并返回弹性中的前 10 名

    我在弹性索引中有一个嵌套数据类型 并且希望对所有返回的结果进行升序排序 我已经尝试过以下方法 GET indexname search source m iTopicID m iYear m Companies query terms m
  • 在继续功能之前等待图像上传的响应

    因此 我正在研究数组中多个图像的上传功能 经过一番努力 我终于让我的上传功能正常工作 并且图像显示在 Firebase 数据库中 然而 我还没有找到一种工作方法来确保我的上传功能在继续之前完成 下面是我调用 upload 函数并尝试将响应存
  • 设置仅适用于一个会话/一名用户

    我创建了一个 WindowsForms 应用程序 然后在以下命令的帮助下进行了设置这个链接 https stackoverflow com questions 56541199 how to create setup exe file fo
  • SQLite 数据库不更新列表视图项并插入新项

    当项目为listview单击后 它会在另一个活动中打开 该活动具有edittext 编辑项目后 当我保存它时 项目不会在列表视图中更新 但会在列表视图中插入一个新条目 如何更新现有项目而不插入新项目 这是我的代码 活动 TRList cla
  • 为什么 memcmp(a, b, 4) 仅有时针对 uint32 比较进行优化?

    鉴于此代码 include
  • 为什么我的按钮的“验证”事件处理程序从未被调用?

    在下面的小应用程序中 我想知道为什么从未调用 BtnOk Validating 事件处理程序 我预计单击 确定 按钮会调用事件处理程序 真实的对话框有更多的控件 每个控件都有一个验证事件处理程序 我的计划是使用 确定 按钮验证事件处理程序