是否有一种方法可以通过不同活动的表单控件来合并迭代



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

我正在创建具有许多额外属性PrevivValue、Modified(类似于Textbox中的属性)、Dirty、DirtyEnabled、SQLColumnName、SQLTableName的自定义控件(Form+表单控件),以便在我的表单中启用自动更新和撤消。表单公开IsDirty、Initialing和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 Update或Insert,但是。。。在成功的SQL活动之后,我需要再次遍历控件,以重置每个控件的修改标志。在其他地方,我需要它来实现一个表单撤消,将所有控件重置为以前的值。

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

有没有更好的方法可以使用我还不掌握的.net功能?

谢谢你的建议。

从控件遍历可能很棘手,因为控件通常是嵌套的。一种更可控的方法是将另一个集合对象添加到表单中,在表单中保留对添加控件的引用。。。。。

例如

Dim My_Widgets as New List(of Your-Control-Class-Name)

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

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对象。。

例如

Dim My_Named_Widgets as new Dictionary(of String, Your-Control-Class-Name)

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

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

然后,您可以通过ID或名称引用特定控件

My_Names_Widgets("ID").Property = Whatever '... etc

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

最新更新