Asp.net 如何改进包含多个case语句的页面设计

Asp.net 如何改进包含多个case语句的页面设计,asp.net,vb.net,Asp.net,Vb.net,我的页面包含:GridView1、GridView2、按钮1、按钮2、下拉列表1 我将GridView绑定到下拉列表中选择的表,如下所示: Dim results as DataTable Select Case ddl1.SelectedValue Case 0 results = dtZero Case 1 results = dtOne Case 2 results = dtTwo Case 3

我的页面包含:GridView1、GridView2、按钮1、按钮2、下拉列表1 我将GridView绑定到下拉列表中选择的表,如下所示:

Dim results as DataTable
Select Case ddl1.SelectedValue
    Case 0
        results = dtZero
    Case 1
        results = dtOne
    Case 2
        results = dtTwo
    Case 3
        results = dtThree
End Select
GridView1.DataSource = results
GridView1.DataBind()
然后我有两个按钮,代码如下:

Protected Sub btn1_Click(sender As Object, e As EventArgs) Handles btn2.Click
    Select Case ddl1.SelectedValue
        Case 0
            RunZero()
        Case 1
            RunOne()
        Case 2
            RunTwo()
        Case 3
            RunThree()
    End Select
End Sub

对我来说,这看起来是一个很大的开销。如何改进然后设计,并且只在下拉列表中指定我正在处理以下记录,而不每次指定
大小写
条件?我应该改变我的设计还是保持原样

更新:
RunZero
RunOne
RunTwo
RemoveZero
RemoveOne
removeWO
RemoveThree
-执行六个不同的存储过程。

这是一个有趣的问题。多谢各位

听起来你应该使用动作

首先创建一个类来跟踪dropdownlist所表示的所有“操作”

Private Function GetOpByDropDownKey(DropDownKey As String) As OpMode
    Return (From x In OpModes Where x.DropDownKey = DropDownKey).First
End Function
编辑:改为使用操作,表明您可以在需要或不需要时为函数使用参数

Class OpMode
    Public DropDownKey As String
    Public RunFunction As Action(Of Int32) 'This one will support a parameter'
    Public RemoveFunction As Action
    Public dt As Data.DataTable

    Sub New(DropDownKey As String, RunFunction As Action(Of Int32), RemoveFunction As Action, dt As Data.DataTable)
        Me.DropDownKey = DropDownKey
        Me.RunFunction = RunFunction
        Me.RemoveFunction = RemoveFunction
        Me.dt = dt
    End Sub
End Class
您应该已经有了运行进程的方法

编辑:在本例中,我为“运行”过程允许了一个参数

我想你在某处有那些数据表

Private dtOne As New Data.DataTable
Private dtTwo As New Data.DataTable
创建一个只读属性以保存所有要使用的操作模式。它很容易重新创建,因此不需要缓存它

Private ReadOnly Property OpModes As List(Of OpMode)
    Get
        Dim _OpModes As New List(Of OpMode)

        _OpModes.Add(New OpMode("1", AddressOf RunOne, AddressOf RemoveOne, dtOne))
        _OpModes.Add(New OpMode("2", AddressOf RunTwo, AddressOf RemoveTwo, dtTwo))

        Return _OpModes
    End Get
End Property
制作一个功能,用于在opmodes列表中搜索与dropdownlist匹配的opmodes

Private Function GetOpByDropDownKey(DropDownKey As String) As OpMode
    Return (From x In OpModes Where x.DropDownKey = DropDownKey).First
End Function
创建一个对两个按钮都有效的click事件并调用相应的方法

编辑:在本例中,
RunFunction
有一个参数,但
RemoveFunction
没有

Private Sub btn_Click(sender As Object, e As System.EventArgs) Handles btn1.Click, btn2.Click
    With GetOpByDropDownKey(dd1.SelectedValue)
        If sender Is btn1 Then
            .RunFunction(12345)
        Else
            .RemoveFunction()
        End If
    End With
End Sub
现在您可以通过编程方式绑定正确的datatable

GridView1.DataSource = GetOpByDropDownKey(dd1.SelectedValue).dt
GridView1.DataBind()
这应该是一个更容易维护,一旦你得到它的工作。您可能会意外忘记在case语句中包含项的位置会更少,因为所有这些定义都在readonly属性中定义了一次

编辑:(删除了关于代理的说明。操作就是您所需要的。)


我希望这对您有所帮助。

编辑:这只适用于VB.Net,而不适用于ASP.Net

实现这一点的一个更简单的方法是使用ToString函数创建一个类,并用它填充列表

Class OpInfo

    Public Sub New(ByVal Text As String, ByVal DataTable As DataTableSelect, ByVal RunMethod As Action, ByVal RemoveMethod As Action)
        _Text = Text
        _DataTable = DataTable
        _RunMethod = RunMethod
        _RemoveMethod = RemoveMethod
    End Sub

    Public ReadOnly Property DataTable As DataTableSelect
        Get
            Return _DataTable
        End Get
    End Property
    Private _DataTable As DataTableSelect

    Public Sub Run()
        _RunMethod()
    End Sub
    Private _RunMethod As Action

    Public Sub Remove()
        _RemoveMethod()
    End Sub
    Private _RemoveMethod As Action

    Public Function Overrides ToString() As String
        Return _Text
    End Function
    Private _Text As String
End Class
您可以使用此类的实例填充列表。通过类型转换选定项,您可以访问其所有成员

Class Form1

    Public Sub New()
        InitializeComponents()
        ddl1.Items.Add(New OpInfo("Zero",  dtZero , AddressOf RunZero , AddressOf RemoveZero )
        ddl1.Items.Add(New OpInfo("One",   dtOne  , AddressOf RunOne  , AddressOf RemoveOne  )
        ddl1.Items.Add(New OpInfo("Two",   dtTwo  , AddressOf RunTwo  , AddressOf RemoveTwo  )
        ddl1.Items.Add(New OpInfo("Three", dtThree, AddressOf RunThree, AddressOf RemoveThree)
    End Sub

    Protected Sub ddl1_SelectedIndexChanged(sender As Object, e As EventArgs)
        If ddl1.SelectedIndex = -1 Then
            ' Code for when nothing is selected.
        Else
            GridView1.DataSource = CType(ddl1.SelectedItem, OpInfo).DataTable
            GridView1.DataBind()
        End If
    End Sub

    Protected Sub btn1_Click(sender As Object, e As EventArgs) Handles btn2.Click
        If ddl1.SelectedIndex <> -1 Then CType(ddl1.SelectedItem, OpInfo).Run
    End Sub

    Protected Sub btn2_Click(sender As Object, e As EventArgs) Handles btn2.Click
        If ddl1.SelectedIndex <> -1 Then CType(ddl1.SelectedItem, OpInfo).Remove
    End Sub
End Class
类格式1
公共分新()
初始化组件()
ddl1.Items.Add(新的OpInfo(“零”,dtZero,AddressOf RunZero,AddressOf RemoveZero)
ddl1.Items.Add(新的OpInfo(“一”,dtOne,RunOne地址,RemoveOne地址)
ddl1.Items.Add(新的OpInfo(“两个”,dtTwo,地址RunTwo,地址RemoveTwo)
ddl1.Items.Add(新的OpInfo(“三”,dtThree,地址RunThree,地址RemoveThree)
端接头
受保护的子ddl1\u SelectedIndexChanged(发送方作为对象,e作为事件参数)
如果ddl1.SelectedIndex=-1,则
'未选择任何内容时的代码。
其他的
GridView1.DataSource=CType(ddl1.SelectedItem,OpInfo).DataTable
GridView1.DataBind()
如果结束
端接头
受保护的子btn1\u单击(发件人作为对象,e作为事件参数)处理btn2。单击
如果ddl1.SelectedIndex-1,则CType(ddl1.SelectedItem,OpInfo)。运行
端接头
受保护的子btn2\u单击(发件人作为对象,e作为事件参数)处理btn2。单击
如果ddl1.SelectedIndex-1,则CType(ddl1.SelectedItem,OpInfo)。删除
端接头
末级

这取决于您的总体操作。例如,
RunXXX
:它们有什么不同?是否可以将它们与传递参数结合起来?无论您给出什么,都没有太多优化的余地。我认为这是不可能的。每个函数都运行单独的存储过程。将此提交给代码审阅,这与她的主题无关无论如何,我不会为了好玩而浪费时间重新编写工作代码。这六个存储过程的参数列表有多大的不同?它们有很大的不同。快告诉我吧!:-)我发现我用类而不是字符串填充了大多数列表框,使它们的功能模块化。唯一的区别是我使用
操作
或自定义委托而不是
事件处理程序
。哇。你已经花了很多时间做这件事。非常感谢。我需要更仔细地研究这件事。明天会做的。等等,data绑定?那太过分了!@Hand-E-Food,你不能用ASP.NET中的类填充列表框。你可以用Windows.Forms来填充列表框,我同意这是Windows.Forms页面的理想选择。我为ASP.NET编写了这篇文章,但它可以应用于两种平台。啊!我错过了这个标签。这是公平的。我还在解决方案中添加了一个关于“Action”类的注释。:)
Class Form1

    Public Sub New()
        InitializeComponents()
        ddl1.Items.Add(New OpInfo("Zero",  dtZero , AddressOf RunZero , AddressOf RemoveZero )
        ddl1.Items.Add(New OpInfo("One",   dtOne  , AddressOf RunOne  , AddressOf RemoveOne  )
        ddl1.Items.Add(New OpInfo("Two",   dtTwo  , AddressOf RunTwo  , AddressOf RemoveTwo  )
        ddl1.Items.Add(New OpInfo("Three", dtThree, AddressOf RunThree, AddressOf RemoveThree)
    End Sub

    Protected Sub ddl1_SelectedIndexChanged(sender As Object, e As EventArgs)
        If ddl1.SelectedIndex = -1 Then
            ' Code for when nothing is selected.
        Else
            GridView1.DataSource = CType(ddl1.SelectedItem, OpInfo).DataTable
            GridView1.DataBind()
        End If
    End Sub

    Protected Sub btn1_Click(sender As Object, e As EventArgs) Handles btn2.Click
        If ddl1.SelectedIndex <> -1 Then CType(ddl1.SelectedItem, OpInfo).Run
    End Sub

    Protected Sub btn2_Click(sender As Object, e As EventArgs) Handles btn2.Click
        If ddl1.SelectedIndex <> -1 Then CType(ddl1.SelectedItem, OpInfo).Remove
    End Sub
End Class