2012-04-22 4 views
0

私は少し問題があります。私は現在、各ページにいくつかのドロップダウンリストを持つウェブページを作っています。ドロップダウンリストの目的は、YUIデータテーブルの情報だけでなく、お互いの情報をフィルタリングすることです。別の場所に異なる商品などがあります。VB.Net 2008の別のサブプロシージャにパラメータとしてサブプロシージャを渡す

私はDBからオプションIDと値を読み取る共通の機能を作っていますが、その情報は3通りの方法で使用できます。現在、ページがロードされると、ドロップダウンリストをロードするAsp:プレースホルダが作成されます。Ajaxによって選択ボックスを更新するように情報が要求された場合は、HTML文字列サーバー側とresponse.writeを連結します。しかし、私のクライアントは、ドロップダウンボックスのリストが長すぎる場合、YUIモーダルパネルとYUIグリッドを使用しているかどうか検索するように要求しました。私はまだサブプロシージャをフェッチするのと同じデータを使いたいと思いますが、今回はJSON文字列としてデータを送り返したいと思います。

現在のところ、プレースホルダを作成するためにページの初期読み込みを行うか、HTML文字列を作成するための更新を読み込むかを示す論理フラグがありますが、 "情報レンダリング/書式設定"サブプロシージャをパラメータこれはいくつかのブール型フラグの必要性を打ち消します。

マイコード

 
    Public Shared Sub LoadCoop(ByRef PlaceHolder As Object, ByVal SearchCriteria As String, ByVal Database As String, ByVal InitialLoad As Boolean) 
     Dim SqlConnection As New SqlConnection 
     Dim SqlCommand As New SqlCommand 
     Dim SqlParameter As New List(Of SqlParameter) 
     Dim SqlReader As SqlDataReader = Nothing 
     Dim FilterList As New List(Of FilterObject) 
     Try 
      SqlConnection = CreateDatabaseConnection(ConnectionString) 
      AddSqlParameterToCollection(SqlParameter, "@SearchCriteria", SearchCriteria) 
      AddSqlParameterToCollection(SqlParameter, "@Database", Database) 
      SqlCommand = CreateSqlCommand("[proc_Dynamic_GetCoop]", SqlConnection, SqlParameter) 
      SqlReader = SqlCommand.ExecuteReader 
      If SqlReader.HasRows Then 
       Do While SqlReader.Read 
        Dim TempFilterObject As FilterObject = New FilterObject 
        TempFilterObject.ID = SqlReader("PSCM_COOP_ID") 
        TempFilterObject.Description = SqlReader("PSCM_COOP_ID") 
        FilterList.Add(TempFilterObject) 
       Loop 
      End If 
     If InitialLoad = True Then 
      CreateHTMLSelectContainer(PlaceHolder, FilterList, "Coop") 
     Else 
      CreateHTMLSelectString(FilterList, "Coop") 
     End If 
    Catch ex As Exception 
     HttpContext.Current.Response.Write("ERROR - An error occurred loading the co-op filter. Please contact the system administrators for assistance.") 
    Finally 
     If Not IsNothing(SqlReader) Then 
      SqlReader.Close() 
      SqlReader = Nothing 
     End If 
     If Not IsNothing(SqlCommand) Then 
      SqlCommand.Dispose() 
      SqlCommand = Nothing 
     End If 
     If Not IsNothing(SqlConnection) Then 
      SqlConnection.Close() 
      SqlConnection.Dispose() 
      SqlConnection = Nothing 
     End If 
    End Try 
End Sub 

Public Shared Sub CreateHTMLSelectContainer(ByRef PlaceHolder As Object, ByVal FilterList As List(Of FilterObject), ByVal ID As String) 
      Dim ReturnString As String = "" 
      For Each Obj As FilterObject In FilterList 
       ReturnString += "opening option tag" & Obj.Description & "closing option tag" 
      Next 

      Dim Container As New HtmlGenericControl("select") 
      Container.ID = "ddl" & ID 
      Container.Attributes.Add("class", "filtering_fields_select") 
      Container.InnerHtml = ReturnString 
      PlaceHolder.Controls.Add(Container) 
      If FilterList.Count > 20 Then 
       PlaceHolder.Controls.Add(New LiteralControl("lookup image goes here")) 
      End If 
     End Sub 

     Public Shared Sub CreateHTMLSelectString(ByVal FilterList As List(Of FilterObject), ByVal ID As String) 
      Dim ReturnString As String = "opening select tag" 
      Dim Obj As FilterObject = Nothing 
      For Each Obj In FilterList 
       ReturnString += "opening option tag" & Obj.Description & "closing option tag" 
      Next 
      ReturnString += "closing select tag" 
      If FilterList.Count > 20 Then 
       ReturnString += "lookup image goes here" 
      End If 
      HttpContext.Current.Response.Write(ReturnString) 
     End Sub 


答えて

0

デリゲートキーワードは、関数を表す変数の型を宣言することができます。これはパラメータ宣言で使用できます。この関数は、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関数にPlaceHolderパラメータを追加する必要があります。

+0

ブリリアント!答えてくれてありがとう。 実際に必要なパラメータだけを使用するjavascriptとは異なり、パラメータは同じでなければならないというのは残念です。 –

+0

さて、最後のパラメータを次のように宣言することで、パラメータの不確定なリストを許可することができます。 ByVal ParamArray args()オブジェクト でもそれはv。醜いですが、私はデリゲートで動作するかどうか懐疑的です。非常に異なるパラメータリストを持つ関数がある場合は、試してみる価値があります。 –

関連する問題