我有一个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集合的顺序。这似乎是次优的解决方案。
是否有更好的方法来控制表单控件验证的顺序?
答案 0 :(得分:2)
ValidateChildren
internally在Controls
集合上使用循环,并以与Controls
集合中出现的顺序相同的方式验证子控件。
要更改引发Validating
事件的顺序,可以使用以下任一选项:
Controls.SetChildIndex
ValidateChildren
并实现自定义逻辑,以自定义顺序引发Validating
事件(例如基于TabOrder
的事件)。答案 1 :(得分:0)
For Each ctrl In Me.Controls.OfType(Of Control).OrderBy(Function(c) c.TabIndex)
Debug.Print(ctrl.Name)
Next
在For ... Next期间进行重新排序