-1

我有一点问题。我目前正在制作一个网页,每页都有几个下拉列表。下拉列表的目的是过滤 YUI 数据表中的信息,以及彼此的信息,例如。不同的地点会有不同的商品等。

我制作了一个通用函数来从数据库中读取选项 ID 和值,但是可以通过 3 种方式使用这些信息。目前,当页面加载时,我创建了一个加载下拉列表的 Asp:Placeholder。如果 Ajax 请求信息来更新选择框,我将连接一个 HTML 字符串服务器端并 response.write 它。但是现在我的客户要求查找下拉框中的列表是否太长,我正在使用 YUI 模态面板和 YUI 网格进行查找。我仍然想使用相同的数据获取子过程,但这次我想将数据作为 JSON 字符串发回。

目前我有布尔标志来表明它是页面初始加载以创建占位符,还是更新加载以创建 HTML 字符串,但我更愿意将“信息呈现/格式化”子过程作为参数传递,这消除了需要几个布尔标志。

我的代码

    公共共享子 LoadCoop(ByRef PlaceHolder 作为对象,ByVal SearchCriteria 作为字符串,ByVal 数据库作为字符串,ByVal InitialLoad 作为布尔值)
        将 SqlConnection 暗淡为新的 SqlConnection
        将 SqlCommand 调暗为新的 SqlCommand
        将 SqlParameter 调暗为新列表(SqlParameter 的)
        将 SqlReader 调暗为 SqlDataReader = 无
        将 FilterList 调暗为新列表(FilterObject 的)
        尝试
            SqlConnection = CreateDatabaseConnection(ConnectionString)
            AddSqlParameterToCollection(SqlParameter, "@SearchCriteria", SearchCriteria)
            AddSqlParameterToCollection(SqlParameter,“@Database”,数据库)
            SqlCommand = CreateSqlCommand("[proc_Dynamic_GetCoop]", SqlConnection, SqlParameter)
            SqlReader = SqlCommand.ExecuteReader
            If SqlReader.HasRows Then
                Do While SqlReader.Read
                    将 TempFilterObject 调暗为 FilterObject = 新的 FilterObject
                    TempFilterObject.ID = SqlReader("PSCM_COOP_ID")
                    TempFilterObject.Description = SqlReader("PSCM_COOP_ID")
                    FilterList.Add(TempFilterObject)
                环形
            万一
        如果 InitialLoad = True 那么
            CreateHTMLSelectContainer(PlaceHolder, FilterList, "Coop")
        别的
            CreateHTMLSelectString(FilterList, "Coop")
        万一
    抓住前任作为例外
        HttpContext.Current.Response.Write("ERROR - 加载合作过滤器时出错。请联系系统管理员寻求帮助。")
    最后
        If Not IsNothing(SqlReader) 则
            SqlReader.Close()
            SqlReader = 无
        万一
        If Not IsNothing(SqlCommand) Then
            SqlCommand.Dispose()
            SqlCommand = 无
        万一
        If Not IsNothing(SqlConnection) 则
            SqlConnection.Close()
            SqlConnection.Dispose()
            SqlConnection = 无
        万一
   结束尝试
结束子

公共共享子 CreateHTMLSelectContainer(ByRef PlaceHolder 作为对象,ByVal 过滤器列表作为列表(过滤器对象),ByVal ID 作为字符串)
            将 ReturnString 调暗为 String = ""
            对于FilterList中的每个Obj作为FilterObject
                ReturnString += "开始选项标签" & Obj.Description & "结束选项标签"
            下一个

            将容器变暗为新 HtmlGenericControl("select")
            Container.ID = "ddl" & ID
            Container.Attributes.Add("class", "filtering_fields_select")
            Container.InnerHtml = ReturnString
            PlaceHolder.Controls.Add(容器)
            如果 FilterList.Count > 20 则
                PlaceHolder.Controls.Add(New LiteralControl("查找图像到这里"))
            万一
        结束子

        Public Shared Sub CreateHTMLSelectString(ByVal FilterList As List(Of FilterObject), ByVal ID As String)
            Dim ReturnString As String = "打开选择标签"
            将 Obj 调暗为 FilterObject = 无
            对于 FilterList 中的每个 Obj
                ReturnString += "开始选项标签" & Obj.Description & "结束选项标签"
            下一个
            ReturnString += "关闭选择标签"
            如果 FilterList.Count > 20 则
                ReturnString += "查找图片放在这里"
            万一
            HttpContext.Current.Response.Write(ReturnString)
        结束子


4

1 回答 1

0

delegate 关键字允许您声明一个表示函数的变量类型。然后可以在参数声明中使用它。使用 variable_name.Invoke(parameters...) 调用该函数。

所以是这样的:

' declares data type representing one of the possible functions
Public Delegate Sub CreateHTMLFunction(ByRef PlaceHolder As Object, ByVal FilterList As List(Of FilterObject), ByVal ID As String)

Public Shared Sub LoadCoop(ByRef PlaceHolder As Object, ByVal SearchCriteria As String, ByVal Database As String, ByVal HTMLFunction As CreateHTMLFunction)
    ' last param is function to call 
    ' snip
    HTMLFunction.Invoke(PlaceHolder, FilterList, "Coop")
End Sub

Public Sub CreateHTMLSelectContainer(ByRef PlaceHolder As Object, ByVal FilterList As List(Of FilterObject), ByVal ID As String)
    ' blah blah
End Sub

Public Sub CreateHTMLSelectString(ByRef PlaceHolder As Object, ByVal FilterList As List(Of FilterObject), ByVal ID As String)
    ' blah blah
End Sub

从调用代码传递参数时,使用 AddressOf function_name:

        LoadCoop(..., ..., ..., Addressof CreateHTMLSelectContainer)

但请注意,所有要传入的函数都需要具有完全相同的参数列表——它们必须与委托的定义完全匹配。因此,即使不使用,您也需要将 PlaceHolder 参数添加到 SelectString 函数中。

于 2012-04-23T22:54:07.327 回答