将多个项目/对象分配给单个值

时间:2014-11-28 20:42:32

标签: c# .net vb.net winforms

我目前正在开发一个项目,其中一个子操作系统有一个标签控件,其中包含大约7个标签。在每个标签中都有一些SplitContainersTableLayoutPanelsFlowLayoutPanels。散布的有许多TextBoxesDateTimePickersCheckBoxes。我希望添加一个具有一个作业的按钮,“重置表单......但不完全。”

我正在试图找出最有效的方法。所以我把迄今为止我尝试过的内容和简化的编码示例放在一起。我只更改了下面代码的内容,而不是它的工作原理。表单上的许多元素都可以通过友好的格式列出。

我的第一个想法就是单独设置所有值,如下所示,但这对代码来说真的很麻烦,它只是增加了所有重复的东西:

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#代码就很酷。


修改

这是来自评论,但我想我会编辑这个问题。我已经完成了任务,我只需手动输入。我实际上只是从设计器文件中得到了我需要的所有项目的名称。这似乎是最不容易出错且最有效的选择,我可以想出来,只有在我之后的任何人都能看到它并且去,“哦,我知道这是做什么的”。这个问题更像是一个后续工作,看看那里有什么类型的选项。

1 个答案:

答案 0 :(得分:0)

处理此问题的两种方法是:

  1. 就像你一样,只需&#34;手动&#34;重置需要初始化的每个控件,或

  2. 完全重置表单,并使用不需要重置的项目填充表单。

  3. 我通常更喜欢第一种方法,因为它似乎更简单,并且在将来的维护中可能不太容易出错。