-1

少し問題があります。現在、各ページにいくつかのドロップダウン リストがある Web ページを作成しています。ドロップダウン リストの目的は、YUI データテーブル内の情報と、互いの情報をフィルタリングすることです。別の場所には別の商品などがあります。

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

現在、プレースホルダーを作成するためのページの初期ロードか、HTML 文字列を作成するための更新ロードかを示すブール値フラグがありますが、「情報のレンダリング/フォーマット」サブプロシージャをパラメーターとして渡したいと思います。いくつかのブール フラグが必要です。

マイコード

    Public Shared Sub LoadCoop (オブジェクトとしての ByRef PlaceHolder、文字列としての ByVal SearchCriteria、文字列としての ByVal データベース、ブール値としての ByVal InitialLoad)
        新しい SqlConnection として Dim SqlConnection
        Dim SqlCommand を新しい SqlCommand として
        Dim SqlParameter As New List(Of SqlParameter)
        Dim SqlReader As SqlDataReader = Nothing
        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
                    Dim TempFilterObject As FilterObject = New 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")
        終了条件
    ex を例外としてキャッチ
        HttpContext.Current.Response.Write("エラー - Co-op フィルターの読み込み中にエラーが発生しました。サポートが必要な場合は、システム管理者にお問い合わせください。")
    ついに
        If Not IsNothing(SqlReader) Then
            SqlReader.Close()
            SqlReader = なし
        終了条件
        If Not IsNothing(SqlCommand) Then
            SqlCommand.Dispose()
            SqlCommand = なし
        終了条件
        If Not IsNothing(SqlConnection) Then
            SqlConnection.Close()
            SqlConnection.Dispose()
            SqlConnection = なし
        終了条件
   エンドトライ
サブ終了

Public Shared Sub CreateHTMLSelectContainer(ByRef PlaceHolder As Object, ByVal FilterList As List(Of FilterObject), ByVal ID As String)
            Dim ReturnString As String = ""
            FilterList 内の FilterObject としての各オブジェクトについて
                ReturnString += "開始オプション タグ" & Obj.Description & "終了オプション タグ"
            次

            Dim Container As New HtmlGenericControl("select")
            Container.ID = "ddl" & ID
            Container.Attributes.Add("class", "filtering_fields_select")
            Container.InnerHtml = ReturnString
            PlaceHolder.Controls.Add(コンテナ)
            If FilterList.Count > 20 Then
                PlaceHolder.Controls.Add(New LiteralControl("ルックアップ画像がここに入る"))
            終了条件
        サブ終了

        Public Shared Sub CreateHTMLSelectString(ByVal FilterList As List(Of FilterObject), ByVal ID As String)
            Dim ReturnString As String = "選択タグを開く"
            Dim Obj As FilterObject = Nothing
            FilterList の各オブジェクトに対して
                ReturnString += "開始オプション タグ" & Obj.Description & "終了オプション タグ"
            次
            ReturnString += "選択タグを閉じる"
            If FilterList.Count > 20 Then
                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 に答える