我刚开始将应用程序从vba(Access)重写为vb.net + SQLServer,因此在.net中没有经验。
我正在创建自定义控件(表单+表单控件),其中包含许多额外属性PrevValue,Modified(类似于Textbox之一),Dirty,DirtyEnabled,SQLColumnName,SQLTableName以启用自动更新和撤消表单中的表单公开IsDirty,Initialising和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.创建一个表单迭代过程,其中包含通常属于另一个类的所有不同活动,并集中在#34;程序,可能会更好(1)但我也不喜欢它。
有没有更好的方法使用我不熟练的.net功能呢?
感谢您的任何建议。
答案 0 :(得分:0)
从控件中迭代可能很棘手,因为控件通常是嵌套的。一种更受控制的方法是在表单中添加另一个集合对象,您可以在其中保留对添加的控件的引用.....
e.g
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
如果您需要直接引用单个控件,请改用字典对象..
e.g。
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
您似乎表示您有其他用于其他目的的控件,因此为每种类型创建类似的集合是明智的。