【问题标题】:Passing a Subprocedure as parameter to another subprocedure in VB.Net 2008将子过程作为参数传递给 VB.Net 2008 中的另一个子过程
【发布时间】:2012-04-22 11:51:23
【问题描述】:

我有一点问题。我目前正在制作一个网页,每页都有几个下拉列表。下拉列表的目的是过滤 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 FilterList 作为列表(FilterObject),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) 结束子

【问题讨论】:

  • 你真的需要这个ByRef PlaceHolder As Object通过引用传递吗?它是一个对象,因此它已经通过引用传递,并且您没有进行任何 = 重新分配,因此它可能是 ByVal (或者只是省略它,因为这是默认设置)。然后你不需要声明一个新的委托,你可以使用适当的Action

标签: asp.net vb.net parameters delegates


【解决方案1】:

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 函数中。

【讨论】:

  • 太棒了!谢谢你的回答。遗憾的是参数必须相同,不像javascript实际上只是使用它需要的参数。
  • 好吧,您可以使用 paramarray 来允许不确定的参数列表,方法是将最后一个参数声明为: ByVal ParamArray args() As Object 但这很丑,我怀疑它是否会与代表一起工作。如果您有大量具有不同参数列表的函数,那么可能值得一试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-19
  • 2013-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-24
相关资源
最近更新 更多