Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ASP.Net-减少验证的重复代码-VB_Asp.net_Vb.net - Fatal编程技术网

ASP.Net-减少验证的重复代码-VB

ASP.Net-减少验证的重复代码-VB,asp.net,vb.net,Asp.net,Vb.net,我有一个表单,上面有许多下拉列表框。我根据表中的值显示或隐藏其中的每一行,然后向该行中包含的文本框添加requiredfieldvalidator。我在每个下拉列表的selectedindexchanged事件上执行此操作,其代码如下所示: Protected Sub cbOffCover_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cbOffCover.SelectedIndexChanged If c

我有一个表单,上面有许多下拉列表框。我根据表中的值显示或隐藏其中的每一行,然后向该行中包含的文本框添加requiredfieldvalidator。我在每个下拉列表的selectedindexchanged事件上执行此操作,其代码如下所示:

Protected Sub cbOffCover_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cbOffCover.SelectedIndexChanged

    If cbOffCover.SelectedValue = "N" Then
        OffCoverRow.Visible = True
        Dim rfOffcover As RequiredFieldValidator = New RequiredFieldValidator
        With rfOffcover
            .ControlToValidate = txtOffCover.ID
            .SetFocusOnError = True
            .ErrorMessage = "*"
            .ForeColor = System.Drawing.Color.Red
        End With
        OffCoverCell.Controls.Add(rfOffcover)
    Else
        OffCoverRow.Visible = False
        Dim c As Control
        For Each c In OffCoverCell.Controls
            If c.ID = "rfOffCover" Then
                OffCoverCell.Controls.Remove(c)
            End If
        Next c
    End If

End Sub
然后,我在每个下拉列表中重复使用此代码,以显示/隐藏不同名称的行,并将验证应用于不同的文本框


我的问题是有没有更好的方法?我不知道具体怎么写,但我忍不住认为我不必为每个下拉列表反复编写这么多代码(或复制/粘贴)。是否可以编写一个函数/类来完成这项工作,而我可以直接调用它?可能看起来很基本,但我是asp/vb新手。非常感谢

您可以将其放入一个返回布尔值的函数中。调用函数时,将combobox本身和任何要验证的值传递给它。如果匹配,则返回true。试着这样做:

Public Function ValidateComboBox(someComboBox as ComboBox, expectedValue as String)
  Dim result as Boolean = False
  If someComboBox.SelectedValue = expectedValue Then
        result = True
        OffCoverRow.Visible = True
        Dim rfOffcover As RequiredFieldValidator = New RequiredFieldValidator
        With rfOffcover
            .ControlToValidate = txtOffCover.ID
            .SetFocusOnError = True
            .ErrorMessage = "*"
            .ForeColor = System.Drawing.Color.Red
        End With
        OffCoverCell.Controls.Add(rfOffcover)
  Else
        OffCoverRow.Visible = False
        Dim c As Control
        For Each c In OffCoverCell.Controls
            If c.ID = "rfOffCover" Then
                OffCoverCell.Controls.Remove(c)
            End If
        Next c
  End If

  Return result

End Function

当然,可以根据您的需要进行修改。可能您只返回值,并在控件的SelectedIndexChanged方法中执行其他操作。

您可以使用同一方法简单地处理多个事件。我只需在句柄后复制部件并将其添加到一个大事件处理程序中。嗨,Christian,谢谢你的回复。我认为这不会作为要显示/隐藏的行的名称,也不会作为验证每个下拉列表的更改的文本框。我认为我在最初的问题中没有明确说明这一点,因此我对其进行了编辑以提供更多信息。您可以重构您的解决方案,以便根据传入的下拉列表动态选择cbOffCover。比如Dim Row=getRow(sender),其中getRow包含识别正确行的逻辑。谢谢道格拉斯,我将尝试根据我的需要调整它。我已经用重复编码完成了所有的工作,但是我会重新尝试一下