0

私のプロジェクトには、3 つのユーザー コントロールがあります。BasicContact、BasicDetail、および ActionTime。それらは EditOrder.aspx ページにあります。

BasicContact には「ReportDate」プロパティ(日付型)、BasicDetail には RadioButtonList「rdl_Priority」(「prio_id」フィールドの整数値)、ActionTime には「CheckDate」プロパティがあります。ReportDate 値は txt_ReportDate と txt_ReportTime から派生し、CheckDate 値は txt_CheckDate と txt_CheckTime から派生します。

私の目的は、ReportDate に日付を追加して radiobuttonlist をクリックした後に Checkdate を計算することです。Checkdate は、ReportDate (日付) + SLAHour (時間、入力が prio_id の "GetSLAHour" メソッドから取得) から計算され、txt_CheckDate と txt_CheckTime にテキストが設定されます。

現在、Postback を使用してこのタスクを完了することができました。カスタム イベントを作成し、RadioButtonList selectedIndexchanged メソッドで発生させます。その後、イベントは EditOrder ページのコード ビハインドで処理されます。これが私のコードです。

BasicDetail - RadioButtonList

<asp:RadioButtonList ID="rdl_Priority" runat="server" RepeatDirection="Horizontal" AutoPostBack="true" />

BasicDetail - コードビハインド

Public Event priorityClicked As System.EventHandler

Private Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
    If Not IsPostBack Then SetupList()
End Sub

Private Sub SetupList()
    Dim ctx As New StsDataContext
    With rdl_Priority
        Dim Result = (From r In ctx.Priorities Order By r.display_order)
        If Result.Count > 0 Then
            .DataTextField = "prio_name"
            .DataValueField = "prio_id"
            .DataSource = Result
            .DataBind()
        Else
            lbl_Priority.Visible = False
            rdl_Priority.Visible = False
        End If
    End With
End Sub

Protected Sub rdl_Priority_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles rdl_Priority.SelectedIndexChanged
    RaiseEvent priorityClicked(sender, e)
End Sub

EditOrder - コードビハインド

Private Sub BasicDetail_priorityClicked(ByVal sender As Object, ByVal e As System.EventArgs) Handles BasicDetail.priorityClicked
    Dim reportDate As Date? = BasicContact.ReportDate
    Dim SLAHour As Integer? = GetSLAHour(BasicDetail.PriorityId)
    If reportDate.HasValue AndAlso SLAHour.HasValue Then
        ActionTime.CheckDate = CDate(reportDate).AddHours(CDbl(SLAHour))
    End If
End Sub

ただし、ページを更新したくありません (ポストバックなし)。JavaScript から関数またはサブルーチンを呼び出す方法がわかりません。PageMethod を試しましたが、実行時にメソッドがサポートされていないというエラーが発生します。とにかく、javascript からコード ビハインドを呼び出すよりも良い方法があれば教えてください。

前もって感謝します

4

1 に答える 1

0

わかりました申し訳ありませんが、これが私の解決策です

今のところ PageMethod を使用してこの問題を解決したので、コード ビハインドからイベント関数を発生させる必要がなくなったので、投稿したすべてのコードを削除して、自分の質問をしました。

まず、BasicDetailコードビハインドのRadioButtonListの各項目にjavascript関数を追加しました

BasicDetail - コードビハインド

Private Sub rdl_Priority_DataBound(ByVal sender As Object, ByVal e As System.EventArgs) Handles rdl_Priority.DataBound
    For Each li As ListItem In rdl_Priority.Items
        Dim slaHour As Integer? = GetSLAHour(li.Value)
        li.Attributes.Add("onclick", "return CalCheckDate(" & If(slaHour.HasValue, CStr(slaHour), "null") & ");")
    Next
End Sub

各ボタンに追加されたこの「CalCheckDate」関数は、EditOrder ページ (ユーザー コントロールの親ページ) に実装されています。

EditOrder.aspx

<script type="text/javascript">
    function CalCheckDate(hour) {
        var hid_ServId = document.getElementById('<%=hid_ServId.ClientID%>');
        var txt_reportDate = document.getElementById('<%=BasicContact.ReportDateTextName%>');
        var txt_reportTime = document.getElementById('<%=BasicContact.ReportTimeTextName%>');
        PageMethods.GetCheckDateTime(hid_ServId.value, txt_reportDate.value, txt_reportTime.value, hour, OnGetCheckDateComplete, OnGetCheckDateError);
    }
    function OnGetCheckDateComplete(result) {
        var txt_checkDate = document.getElementById('<%=ActionTime.CheckDateTextName%>');
        var txt_checkTime = document.getElementById('<%=ActionTime.CheckTimeTextName%>');
        var chkDateTime = result.split(" ");
        txt_checkDate.value = chkDateTime[0];
        txt_checkTime.value = chkDateTime[1];
    }
    function OnGetCheckDateError(e)
    {
        alert(e._message);
    }
</script>

BasicContact の txt_ReportDate などのユーザー コントロール内の子コントロールは、次のように BasicContact でプロパティを作成することによって派生させることができます。

BasicContact - 分離コード

Public ReadOnly Property ReportDateTextName() As String
    Get
        Return txt_ReportDate.ClientID
    End Get
End Property

このプロパティは「CalCheckDate」関数で使用され、その値を取得して PageMethod 関数に渡します。他のコントロールも同じ方法で導出できます。

最後のステップは、EditOrder コード ビハインドで PageMethods 関数「GetCheckDateTime」をコーディングすることです。

EditOrder - コード ビハインド

<System.Web.Services.WebMethod()> _
Public Shared Function GetCheckDateTime(ByVal servId As String, ByVal ReportDate As String, ByVal ReportTime As String, ByVal hour As String) As String
    Dim checkDate As String, checkTime As String
    '************************************************************************
    'Calculate check and time date from input ReportDate, ReportTime and hour
    '************************************************************************
    Return checkDate & " " & checkTime
End Function

結果はjavascriptの「OnGetCheckDateComplete」関数(例外があれば「OnGetCheckDateError」)に返されます。ここでは、文字列を分割し、その値を使用してテキスト ボックスにテキストを設定します。

于 2012-06-14T03:26:54.343 に答える