0

少し検索しても、明確な答えが見つかりませんでした。

数字を含む大きな HTML テーブルがあります。$ または日でテーブルを表示したい場合にユーザーがクリックできるセレクター (radiobuttonlist) があります。

現在は完全に機能しますが、ユーザーが 2 つのラジオボタンのいずれかをクリックするたびにコード ビハインド関数 (RefreshTable) を呼び出しているため、ページが更新されます。形式が変更され、RefreshTable 関数によって新しい計算が行われる必要があるためです。

. ajaxなどを使用してページを更新せずにその関数を呼び出す方法はありますか? この関数には 1 つのパラメーターしかありません: ProjectID、VB.NET でコーディングされており、ASP.NET を使用しています。

これは .ASPX ページのテーブル コードです。これはシェルのみです。RadioButton が変更されたとき (autopostback=true) に呼び出される VB.NET メソッドを介してすべてが追加されるため、どれが選択されているかを確認し、VB.NET メソッドを実行します。テーブルに入力します。(関数のコードは以下です)

注:機密情報であるため、一部の列\変数名を変更しましたが、全体像を把握できます。

  <td>
    <asp:RadioButtonList  RepeatDirection="Horizontal" id="rdiolist" onclick="alert('hello');" runat="server" RepeatLayout="flow" AutoPostBack="true">
   <asp:ListItem selected="true"> $ </asp:ListItem>
   <asp:ListItem> Days </asp:ListItem>
</asp:RadioButtonList>
</td>
</tr>
</table>

<br />

    <table id="tblBudgetRessourceVP" runat="server" class="ProjetTable ProjetTableHover">
    <thead>
    <tr>
    <th style="width:80px">COLUMN 1</th>
    <th style="width:120px">COLUMN 2/th>
    <th style="width:120px">COLUMN 3</th>
    <th style="width:120px">COLUMN 4</th>
    <th style="width:120px">COLUMN 5</th>
    <th style="width:120px">COLUMN 6</th>
    <th style="width:120px">COLUMN 7</th>
    <th style="width:120px">COLUMN 8</th>
    </tr>
    </thead>

    </table>

コード ビハインド メソッドは、ポストバックなしで呼び出したいものです。すべてのページ更新を削除したいと考えています。関数のサンプルを投稿します。これは、すべての列に対して実行されるため、非常に反復的であるためです。かなり機密性の高いデータであるため、いくつかの変数名をランダムな名前に置き換えました。

Private Sub FillTable(ByVal vProjetID As String)
    Dim sqlquery As String = "SELECT SUM(EFFORT_RESRC.NB_JP_PLANF) as Planifie, SUM(EFFORT_RESRC.NB_JP_DDC) as DDC, SUM(EFFORT_RESRC.NB_JP_REEL) as Reel, SUM(EFFORT_RESRC.NB_JP_RESTN) as RAF, " & _
                "SUM(EFFORT_RESRC.NB_JP_REVS) as Revise, SUM(EFFORT_RESRC.NB_JP_PROJT) as Projete, SUM(EFFORT_RESRC.ECART_REVS_PROJT) as Ecart,RESRC.ID_VP , VICE_PRESD.DE_VP, TA_COMPS.TAUX " & _
                "FROM EFFORT_RESRC INNER JOIN " & _
                "TA_COMPS ON EFFORT_RESRC.COMPOSANTEID = TA_COMPS.COMPOSANTEID INNER JOIN " & _
                "RESRC ON EFFORT_RESRC.NO_EMPLY = RESRC.NO_EMPLY INNER JOIN " & _
                "VICE_PRESD ON RESRC.ID_VP = VICE_PRESD.ID_VP " & _
                "WHERE EFFORT_RESRC.PROJETID = '" & vProjetID & "' AND EFFORT_RESRC.ANNEE = '" & dd_ressourceprojet_annee.SelectedValue & "' AND TA_COMPS.ANNEE = '" & dd_ressourceprojet_annee.SelectedValue & "' " & _
                "GROUP BY RESRC.ID_VP, VICE_PRESD.DE_VP, TA_COMPS.TAUX " & _
                "ORDER BY VICE_PRESD.DE_VP"

    Dim dtRessource As New DataTable
    Master.GetDataTable(dtRessource, sqlquery)

    While (tblBudgetRessourceVP.Rows.Count > 1)
        tblBudgetRessourceVP.Rows.RemoveAt(1)
    End While

    Dim tr As HtmlTableRow
    Dim td As HtmlTableCell


    For Each ressource As DataRow In dtRessource.Rows

        If ressource("DE_VP") <> curStrVP And curStrVP <> String.Empty Then
            tr = New HtmlTableRow

                td = New HtmlTableCell
                td.InnerHtml = curStrVP
                tr.Cells.Add(td)

                td = New HtmlTableCell
            td.Attributes.Add("class", "budget")
            If rdiolist.SelectedIndex = 0 Then // Check the selector, if $ or Days display
                td.InnerHtml = Format(curPlan, "### ### ### ### ### ##0.00$")
            Else
                td.InnerHtml = Format(curPlan, "####")
            End If
            totPlan += curPlan
            tr.Cells.Add(td)  // Add the cell to the table.

            td = New HtmlTableCell
            td.Attributes.Add("class", "budget")

            If rdiolist.SelectedIndex = 0 Then // Check if JP or $ is selected for display format.
                td.InnerHtml = Format(curDDC, "### ### ### ### ### ##0.00$")
            Else
                td.InnerHtml = Format(curDDC, "####")
            End if
            totDDC += curDDC
            tr.Cells.Add(td)

            td = New HtmlTableCell
            td.Attributes.Add("class", "budget")
            If rdiolist.SelectedIndex = 0 Then  // Check if JP or $ is selected for display format.
                td.InnerHtml = Format(curRevise, "### ### ### ### ### ##0.00$")
            Else
                td.InnerHtml = Format(curRevise, "####")
            End If
            totRevise += curRevise
            tr.Cells.Add(td)

みんな、ありがとう。

4

2 に答える 2

1

申し訳ありませんが、とても長い間VBに触れていないため、回答が少し遅れています。

ここで、完全なポストバックを行わずにサーバーからデータを取得したいクリック時に div (ボタンまたは任意の html 要素) があるとします。以下は HTML の設定です。

<div id="click">click</div>
<div id="dvTest"></div>
<script src="Scripts/jquery-1.4.1.min.js" type="text/javascript"></script>
<script src="Scripts/json2.js" type="text/javascript"></script>

以下は、使用する jquery コードです。

<script type="text/javascript">
    $(function () {
        $("#click").click(function () {
            var o = new Object();
            o.ProjectId = 1;
            var x = JSON.stringify(o);
            $.ajax({
                url: 'Default.aspx/GetData',
                type: 'POST',
                dataType: 'JSON',
                contentType: 'application/json;charset=utf-8;',
                data: x,
                success: function (data) {
                    data = JSON.parse(data);
                    var d=data.hasOwnProperty("d") ? data.d : data;
                    //as we are returning fully rendered table
                    //we can directly set html of container div
                    $("#dvTest").html(d);
                },
                error: function (a, b, c) {
                    alert(b);
                }
            });
        });
    });
</script>

これは、分離コード ファイル (aspx.vb ファイル) に書き込む必要があるものです。属性で修飾されたこのpublic sharedメソッドWebMethodは と呼ばれPageMethodます。HtmlTableオブジェクトは自動的にシリアル化できないため、HtmlWriterを使用して as にレンダリングし、StringBuilder完全な HTML をクライアント側に返す必要があります。

<WebMethod()>
Public Shared Function GetData(ByVal ProjectId As String) As String

    Dim tbl As New HtmlTable
    Dim tr As HtmlTableRow
    Dim td As HtmlTableCell

    'instead of these loops you will polulate table rows/cells
    'based on the data returned in your data table
    For I As Integer = 1 To 5
        tr = New HtmlTableRow
        For j As Integer = 1 To 5
            td = New HtmlTableCell
            td.InnerHtml = "Cell " & I & j
            tr.Cells.Add(td)
        Next
        tbl.Rows.Add(tr)
    Next

    Dim sb As New StringBuilder
    Dim sr As New StringWriter(sb)
    Dim hr As New HtmlTextWriter(sr)
    tbl.RenderControl(hr)
    Return sb.ToString()
End Function

編集:- ASP.Net は、.Net オブジェクトをシリアル化して JSON オブジェクトを返します。ただし、このアプローチは、HtmlTableオブジェクトが実装されておらずInnerHTML、そこで例外がスローされるため、オブジェクトでは機能しません。

于 2012-05-19T21:36:40.963 に答える
0

AJAX を使用すると、汎用ハンドラーを作成できます (VS 2008 以降を使用していると仮定します)。ジェネリック ハンドラーには.ashx、拡張機能ではなく.aspx拡張機能があります。基本的に、Web フォーム.aspxには UI コンポーネントとコード ビハインドがあるのに対し、出力を制御できます。 .ashxファイルは基本的に空白で、コード ビハインドへの参照があります。コード ビハインドでは、AJAX 応答に必要な出力が必要なコードを記述できます。

于 2012-05-19T21:20:43.957 に答える