Winforms控件验证顺序

时间:2018-12-06 16:49:41

标签: .net vb.net winforms

我有一个winforms应用程序,它从非常高的层次在datagridview中显示了一堆财务数据,其中每一列代表一年中的一周数。该程序可以右键单击一个单元格并将其值复制到网格中的一系列单元格中。

右键单击源单元格将打开一个简单的表单,用户可以在其中输入开始周和停止周。验证开始/结束一周的输入后,父表单将检索这些值,并使用它们将源值复制到目标单元格的范围内。

我的“停止周”验证事件处理程序中的最终验证检查将开始周值与停止周值进行比较,以确保开始周小于停止周。为了使它起作用,我需要在“停止周”验证事件之前触发“开始周”验证事件。作为附加信息,我将使用以下代码块触发验证

#include <stdio.h>

int main(void)
{
    int a[10];

    printf("%zu\n%zu\n", sizeof a, sizeof &*a);

    return 0;
}

但是,当我第一次开始编写此代码时,“ Stop Week”验证事件首先触发。我发现在设计器文件中,“停止周”文本框在“开始周”文本框之前添加到了表单控件集合中。我能够控制验证事件顺序的唯一方法是更改​​将控件添加到设计器中的Forms Controls集合的顺序。这似乎是次优的解决方案。

是否有更好的方法来控制表单控件验证的顺序?

2 个答案:

答案 0 :(得分:2)

ValidateChildren internallyControls集合上使用循环,并以与Controls集合中出现的顺序相同的方式验证子控件。

要更改引发Validating事件的顺序,可以使用以下任一选项:

  • 在设计时,使用文档大纲窗口对控件重新排序
  • 在运行时,使用Controls.SetChildIndex
  • 更改控件集合中的控件索引
  • 覆盖ValidateChildren并实现自定义逻辑,以自定义顺序引发Validating事件(例如基于TabOrder的事件)。

答案 1 :(得分:0)

  1. 您可以在“属性”窗口中设置TabIndex
For Each ctrl In Me.Controls.OfType(Of Control).OrderBy(Function(c) c.TabIndex)
  Debug.Print(ctrl.Name)
Next

在For ... Next期间进行重新排序

  1. 您还可以在Form1.Designer.vb中编辑订单,将控件添加到Controls集合中。有风险的业务,我相信它会在某些时候被覆盖。