当我遍历For Each时,如何根据复选框状态选择特定变量

时间:2017-09-07 15:32:44

标签: vb.net variables checkbox foreach selection

我正在处理一个项目,该项目要求我遍历标签页上的控件列表以查找所有复选框。然后根据框的状态(选中或取消选中)选择单个变量(文件名),然后执行批量重命名或删除文件系统上的文件(cb.checked =执行操作)。

我已经设法为每个"创建了#34;对于控件的迭代(感谢谷歌),但我正在努力弄清楚如何选择变量。显然,它们的名称都不同,复选框也是如此。此外,复选框静态分配给表单/标签页。这就是我现在所拥有的。

Public Sub delBut_code(ByRef fname As String)
    If (Sanity = 1) Then
        For Each cb As Control In Form1.Controls
            If TypeOf cb Is CheckBox AndAlso DirectCast(cb, 
                        CheckBox).Checked Then
                If My.Computer.FileSystem.FileExists(fname) Then
                    My.Computer.FileSystem.DeleteFile(fname)
                End If
            End If
        Next
        MessageBox.Show("All Actions Completed Successfully")
    Else
        MessageBox.Show("Please select a File To Delete")
    End If
End Sub

以下是一些变量的示例:

 Dim castle As String = selPath & "\zm_castle_loadingmovie.txt"
 Dim factory As String = selPath & 
         "\zm_factory_load_factoryloadingmovie.txt"
 Dim island As String = selPath & "\zm_island_loadingmovie.txt"

N.B selpath收集用户输入的文件夹路径,可在此处忽略

我真的很感激任何指针。

1 个答案:

答案 0 :(得分:0)

首先,你可以用循环做得更好:

Public Sub delBut_code(ByRef fname As String) 
    If Sanity <> 1 Then 
        MessageBox.Show("Please select a File To Delete")
        Exit Sub
    End If

    Dim checked = Form1.Controls.OfType(Of CheckBox)().Where(Function(c) c.Checked)
    For Each box As CheckBox in checked
        Try  
           'A file not existing is only one reason among many this could fail, 
            ' so it needs to be in a Try/Catch block.
            ' And once you're using a Try/Catch block anyway,
            ' the FileExists() check becomes a slow and unnecessary extra trip to the disk.
            My.Computer.FileSystem.DeleteFile(fname)
        Catch
           'Do something here to let the user know it failed for this file
        End Try
    Next
    MessageBox.Show("All Actions Completed")
End Sub

但现在你需要知道fname变量中的正确值是多少。问题中没有足够的信息让我们完全回答这个问题,但我们可以给出一些建议。有很多方法可以做到这一点:

  • 在构建字符串变量时,在复选框中设置Tag属性。然后fname变为DirectCast(box.Tag, String)
  • 从CheckBox继承自定义控件,而不是使用具有文件名的附加String属性的普通复选框。在构建字符串变量时设置此属性。
  • 以您可以从CheckBox变量名称派生字符串变量名称的方式命名您的字符串变量,然后使用Switch从每个box.Name中选择正确的字符串变量。
  • 保留一个Dictionary(Of CheckBox, String),将复选框映射到正确的字符串值。

但是在不了解应用程序的更多背景的情况下,我会毫不犹豫地推荐其中任何一个最适合您的情况。