我目前正在开发一个项目,其中一个子操作系统有一个标签控件,其中包含大约7个标签。在每个标签中都有一些SplitContainers
,TableLayoutPanels
和FlowLayoutPanels
。散布的有许多TextBoxes
,DateTimePickers
和CheckBoxes
。我希望添加一个具有一个作业的按钮,“重置表单......但不完全。”
我正在试图找出最有效的方法。所以我把迄今为止我尝试过的内容和简化的编码示例放在一起。我只更改了下面代码的内容,而不是它的工作原理。表单上的许多元素都可以通过友好的格式列出。
我的第一个想法就是单独设置所有值,如下所示,但这对代码来说真的很麻烦,它只是增加了所有重复的东西:
Private Sub resetBtn_Click(sender As Object, e As EventArgs) Handles resetBtn.Click
fooBox.Text = String.Empty
barBox.Text = String.Empty
otherBox.Text = String.Empty
hammerBox.Text = "Hammer Time!"
fooPicker.Value = DateTime.Now
barPicker.Value = DateTime.Now
otherPicker.Value = DateTime.Now
somwherePicker.value = DateTime.Now.Date.AddHours(17) ' 5'o clock somewhere...
fooCheck.Checked = True
barCheck.Checked = True
otherCheck.Checked = True
soupCheck.Checked = False ' No soup for you!
End Sub
我可以做一个递归For循环,找到每种类型的项目并设置除了需要默认值的项目之外的值,但这似乎是执行期间的大量额外工作,主要是因为有数百个,可能是数千个表单上的控件已生成成员,而更多则不生成成员。以下是我的for循环方式:
Private Sub resetBtn_Click(sender As Object, e As EventArgs) Handles resetBtn.Click
Dim excludes As New Dictionary(Of String, Object) From {{"hammerBox", "Hammer Time!"}, {" somwherePicker", DateTime.Now.Date.AddHours(17)}, {"soupCheck", False}}
SearchSubControls(Me, excludes)
End Sub
Private Sub SearchSubControls(parentCtrl As Object, exclude As Dictionary(Of String, Object))
Try
For Each ctrl As Object In parentCtrl.Controls
If exclude.ContainsKey(ctrl.Name) Then
Select Case True
Case TypeOf ctrl Is TextBox
ctrl.Text = exclude(ctrl.Name)
Case TypeOf ctrl Is DateTimePicker
ctrl.Value = exclude(ctrl.Name)
Case TypeOf ctrl Is CheckBox
ctrl.Checked = exclude(ctrl.Name)
End Select
Else
Select Case True
Case TypeOf ctrl Is TextBox
ctrl.Text = String.Empty
Case TypeOf ctrl Is DateTimePicker
ctrl.Value = DateTime.Now
Case TypeOf ctrl Is CheckBox
ctrl.Checked = True
End Select
End If
If ctrl.Controls.Count <> 0 Then
SearchSubControls(ctrl, exclude)
End If
Next
Catch ex As Exception
Console.WriteLine(ex.Message)
End Try
End Sub
所以我正在做一些搜索,我找到了this question for Python。我想知道VB中是否有类似的等效?到目前为止我还没找到任何东西。如果它不存在,是否可以实现或者是否需要修改编译器?我真的希望能用这么简单的东西来完成:
Private Sub resetBtn_Click(sender As Object, e As EventArgs) Handles resetBtn.Click
fooBox.Text, barBox.Text, otherBox.Text = String.Empty
fooPicker.Value, barPicker.Value, otherPicker.Value = DateTime.Now
fooCheck.Checked, barCheck.Checked, otherCheck.Checked = True
hammerBox.text ="Hammer Time!"
somwherePicker.value = DateTime.Now.Date.AddHours(17)
soupCheck.Checked = False
End Sub
或者有一种更好的方法可以解决这个问题吗?
备注:只要有VB对应的C#代码就很酷。
这是来自评论,但我想我会编辑这个问题。我已经完成了任务,我只需手动输入。我实际上只是从设计器文件中得到了我需要的所有项目的名称。这似乎是最不容易出错且最有效的选择,我可以想出来,只有在我之后的任何人都能看到它并且去,“哦,我知道这是做什么的”。这个问题更像是一个后续工作,看看那里有什么类型的选项。
答案 0 :(得分:0)
处理此问题的两种方法是:
就像你一样,只需&#34;手动&#34;重置需要初始化的每个控件,或
完全重置表单,并使用不需要重置的项目填充表单。
我通常更喜欢第一种方法,因为它似乎更简单,并且在将来的维护中可能不太容易出错。