Vb.net 有没有一种方法可以通过不同活动的表单控件来整合迭代

Vb.net 有没有一种方法可以通过不同活动的表单控件来整合迭代,vb.net,winforms,auto-update,undo,Vb.net,Winforms,Auto Update,Undo,我刚开始将一个应用程序从vba(Access)重写到vb.net+SQLServer,所以在.net方面没有太多经验 我正在创建自定义控件(表单+表单控件),其中包含许多额外属性PrevValue、Modified(类似于Textbox)、Dirty、DirtyEnabled、SQLColumnName、SQLTableName,以便在表单中自动更新和撤消表单公开的IsDirty、Initializing和Isready属性以及撤消方法 因此,我不得不在不同的地方编写3次相同的迭代代码: For

我刚开始将一个应用程序从vba(Access)重写到vb.net+SQLServer,所以在.net方面没有太多经验

我正在创建自定义控件(表单+表单控件),其中包含许多额外属性PrevValue、Modified(类似于Textbox)、Dirty、DirtyEnabled、SQLColumnName、SQLTableName,以便在表单中自动更新和撤消表单公开的IsDirty、Initializing和Isready属性以及撤消方法

因此,我不得不在不同的地方编写3次相同的迭代代码:

For each Ctrl as Control in frm.Controls ' frm being a reference to the form
    if typeOf Ctrl is MyTextBox
        with DirectCast(Ctrl, MyTextBox)
            ' here comes the variable code depending what needs to be done
        end with
    elseif TypeOf Ctrl is MyComboBox
    ' etc.... for MyListBox, MyCheckBox etc....
我还有许多自定义控件MyNumBox和MyDateBox,它们继承自MyTextBox,但具有一些修改的行为(公式计算、日期操作、日历…),如何避免对它们进行额外测试

此迭代的一个版本位于SQLProcessClass中,其中修改的控件作为SQLParameter添加,并在迭代后调用SQLProcessClass更新或插入,但是。。。SQL活动成功后,我需要再次遍历控件以重置每个控件的修改标志。在其他地方,我需要它来实现一个表单撤销,将所有控件重置为它们以前的值

在我看来,我有两个选择 1.在需要迭代表单控件的任何地方重复该迭代代码。我不喜欢它,因为每次我需要创建一个新的自定义控件时,我必须在不同的模块/类中添加X行。。。非常糟糕的编程 2.创建一个表单迭代过程,其中包含通常属于该“集中”过程中的另一个类的所有不同活动,这可能比(1)更好,但我也不太喜欢它

有没有更好的方法来使用一些我还没有掌握的.net功能呢


感谢您的建议。

由于控件通常是嵌套的,因此从控件迭代可能会很棘手。一种更受控制的方法是将另一个集合对象添加到表单中,在表单中保留对添加控件的引用

e、 g

然后,当您为表单创建控件时,也会将它们添加到该列表中

My_Widgets.Add(Widget_Object)
For Each Widget as My_Widget_CLass in My_Widgets
    ' do what you need to do to Widget
Next
在这之后,遍历该列表是一件简单的事情

My_Widgets.Add(Widget_Object)
For Each Widget as My_Widget_CLass in My_Widgets
    ' do what you need to do to Widget
Next
如果需要直接引用单个控件,请改用dictionary对象

e、 g

然后按名称将控件引用添加到字典中

My_Named_WIdgets.add("<Whatever_You_USe_To_Identify_It>", Widget_Object)

您似乎表示您有其他控件用于其他目的,因此为每种类型创建类似的集合是谨慎的。

在frm.controls.OfType(属于MyTextBox)中为每个ctrl-as-MyTextBox创建
。。。只循环该类型并将
ctrl
转换为该类型;不过,您必须执行多个循环。@puropoix,thks代表您的答案,但这不会改变逻辑,也不会改变将相同代码复制并粘贴到不同模块以实现的需要原始想法,但这不会改变程序逻辑,即我必须逐个迭代每个集合。。。。对于表单结构的任何更改,都需要更改正确的集合(对于维护来说是危险的)。我更喜欢嵌套控件的递归迭代
My_Names_Widgets("ID").Property = Whatever '... etc