3

これがシナリオです。

asp:PlaceHolder を含む単純なページがあります。

<%@ Page Title="" Language="VB" MasterPageFile="~/MasterPage.master" AutoEventWireup="false" CodeFile="TrainingPlan.aspx.vb" Inherits="TrainingPlan" %>
<%@ Reference Control="ctlTask.ascx" %>
<%@ Reference Control="ctlTaskheader.ascx" %>

<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" Runat="Server">

    <div class="centered">
        <h2><asp:Label ID="lblPlanTitle" runat="server" Text="Plan Title"></asp:Label></h2>
        <hr />
        <br />
        <asp:ImageButton ID="imgbtnSave" runat="server" ImageUrl="~/Images/save.ico" />
        <br />
        <asp:PlaceHolder ID="PlanPlaceHolder" runat="server"></asp:PlaceHolder>
    </div>
</asp:Content>

このページのプレースホルダーには、同じ Web ユーザー コントロールの複数の行が取り込まれています。この Web ユーザー コントロールには、いくつかのテキスト ボックスが含まれています。この Web ユーザー コントロールのテキスト ボックスごとに、テキスト値を設定および取得するためのパブリック プロパティがあります。Web ユーザー コントロールのページ読み込みイベントで、onClick 属性をこれらのテキスト ボックスの一部に追加しています。

Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
    txtTrainingStart.Attributes.Add("onClick", "txtTrainingStart_Click(" &  txtTrainingStart.ClientID & ", " & txtTask.ClientID & ");")
    txtTraineeBadgeNum.Attributes.Add("onClick", "txtTraineeBadgeNum_Click(" & txtTraineeBadgeNum.ClientID & ", " & txtTask.ClientID & ", " & txtTrainingStart.ClientID & ");")
    txtTrainerBadgeNum.Attributes.Add("onClick", "txtTrainerBadgeNum_Click(" & txtTrainerBadgeNum.ClientID & ", " & txtTrainingComplete.ClientID & ", " & txtTask.ClientID & ", " & txtTraineeBadgeNum.ClientID & ", " & Session.Item("isTrainer").ToString.ToLower & ");")
    txtDecertifyingOfficial.Attributes.Add("onClick", "txtDecertifyingOfficial_Click(" & txtDecertifyingOfficial.ClientID & ", " & txtTrainerBadgeNum.ClientID & ", " & txtTask.ClientID & ", " & Session.Item("isDecertifyingOfficial").ToString.ToLower & ");")
End Sub

これらの onClick イベントごとに、対応する JavaScript 関数があります。

<script type="text/javascript">
    function txtTrainingStart_Click(txtTrainingStart, txtTask) {
        //processing and updates to textboxes here
    }
</script>

これが問題です。

プレースホルダーを含むメイン ページには、保存ボタンがあります。保存ボタンのクリック イベントでは、プレースホルダーに含まれる各 Web ユーザー コントロールをループして、データを処理および保存します。

Protected Sub imgbtnSave_Click(sender As Object, e As ImageClickEventArgs) Handles imgbtnSave.Click
    For Each item As Control In PlanPlaceHolder.Controls
        Dim task As ctlTask = TryCast(item, ctlTask)

        If Not IsNothing(task) Then
            'need updated textbox values here. 
            'The following line gets the original textbox value, not the updated value that I need
            Dim test As String = task.trainingStart

        End If
    Next
End Sub

私が試したことはすべて、ページが読み込まれたときにテキストボックスにあった元の値しか取得できません。これは単純であるべきだと思いますが、基本的なものが欠けているだけです。解決策をグーグルで高低を検索しましたが、まだ見つけていません。これは私が見つけた最も近いものでした - > Javascript PROPER way で asp:label の Text プロパティを設定します。その投稿はテキストボックスではなくラベルを扱っており、いくつかの Web ユーザーコントロールを含むプレースホルダーを使用していません。私が理解していることから、クライアントからサーバーに更新を POST する必要がありますが、これを行う方法がわかりません。プロパティを使用してみましたRequest.Formが、うまくいかなかったようです。私は何が欠けていますか?

助けてくれてありがとう、ライラン

EDIT
これは、要求に応じてプレースホルダーに Web ユーザー コントロールを設定するコードです。

Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
    Dim DBConn As MySqlConnection
    Dim cmd As New MySqlCommand

    DBConn = New MySqlConnection(Globals.mysqlConStr)

    Try
        lblPlanTitle.Text = Request.QueryString("plan_name") & " Training Plan"

        If Session.Item("empID") = -1 Then
            empID = clsUser.getID
        Else
            empID = Session.Item("empID")
        End If

        Dim strSQL As String = "SELECT * FROM task_revs tr WHERE tr.change != 'Deleted' and tr.id_plan = " & Request.QueryString("id_plan") & " ORDER BY task_num, rev_date desc"
        Dim da As New MySqlDataAdapter(strSQL, DBConn)
        Dim dtAllRevs As New DataTable
        da.Fill(dtAllRevs)

        Dim dtCurrentRev As New DataTable
        Dim lastTaskNum As String = ""
        dtCurrentRev = dtAllRevs.Clone
        For Each row As DataRow In dtAllRevs.Rows
            If lastTaskNum <> row("task_num") Then
                dtCurrentRev.ImportRow(row)
                lastTaskNum = row("task_num")
            End If
        Next

        strSQL = "SELECT * FROM checkoffs WHERE emp_id = " & empID
        da = New MySqlDataAdapter(strSQL, DBConn)
        Dim dtCheckoffs As New DataTable
        da.Fill(dtCheckoffs)
        Dim addColor As Boolean = True
        Dim tabWidth As Integer

        Dim Header As ctlTaskHeader = LoadControl("ctlTaskHeader.ascx")
        PlanPlaceHolder.Controls.Add(Header)

        For Each row As DataRow In dtCurrentRev.Rows
            Dim newRow As ctlTask = LoadControl("ctlTask.ascx")
            tabWidth = 0

            newRow.id_Task = row("id_Task")
            newRow.taskNum = row("task_num")
            newRow.task = row("task")

            If row("is_header") = True Then
                If row("task_num").ToString.EndsWith(".0") And row("task_num").ToString.Split(".").Count = 2 Then
                    newRow.taskBold = True
                    newRow.taskItalic = True
                Else
                    newRow.taskForeColor = Drawing.Color.Blue
                    newRow.taskItalic = True
                    tabWidth += 10
                End If
            Else
                tabWidth += 10
            End If

            For i As Integer = 0 To row("task_num").ToString.Split(".").Count - 3
                tabWidth += 10
            Next
            newRow.TabSize = tabWidth

            If Not IsDBNull(row("task_level")) Then
                For i As Integer = 0 To row("task_level") - 1
                    newRow.taskLevel = newRow.taskLevel & "*"
                Next
            End If

            If addColor = True Then
                newRow.taskNumBackColor = Drawing.Color.LightGray
                newRow.taskLevelBackColor = Drawing.Color.LightGray
                newRow.taskBackColor = Drawing.Color.LightGray
                newRow.trainingStartBackColor = Drawing.Color.LightGray
                newRow.trainingCompleteBackColor = Drawing.Color.LightGray
                newRow.traineeBadgeNumBackColor = Drawing.Color.LightGray
                newRow.trainerBadgeNumBackColor = Drawing.Color.LightGray
                newRow.decertifyingOfficialBackColor = Drawing.Color.LightGray
            End If
            addColor = Not addColor

            For Each checkoff As DataRow In dtCheckoffs.Rows
                If checkoff("id_task") = row("id_task") Then
                    If Not IsDBNull(checkoff("training_start")) Then
                        newRow.trainingStart = checkoff("training_start")
                    End If
                    If Not IsDBNull(checkoff("training_complete")) Then
                        newRow.trainingComplete = checkoff("training_complete")
                    End If
                    If Not IsDBNull(checkoff("trainee_badge")) Then
                        newRow.traineeBadgeNum = checkoff("trainee_badge")
                    End If
                    If Not IsDBNull(checkoff("trainer_badge")) Then
                        newRow.trainerBadgeNum = checkoff("trainer_badge")
                    End If
                    If Not IsDBNull(checkoff("decertifying_official")) Then
                        newRow.decertifyingOfficial = checkoff("decertifying_official")
                        newRow.taskNumBackColor = Drawing.Color.LightSalmon
                        newRow.taskLevelBackColor = Drawing.Color.LightSalmon
                        newRow.taskBackColor = Drawing.Color.LightSalmon
                        newRow.trainingStartBackColor = Drawing.Color.LightSalmon
                        newRow.trainingCompleteBackColor = Drawing.Color.LightSalmon
                        newRow.traineeBadgeNumBackColor = Drawing.Color.LightSalmon
                        newRow.trainerBadgeNumBackColor = Drawing.Color.LightSalmon
                        newRow.decertifyingOfficialBackColor = Drawing.Color.LightSalmon
                    End If
                End If
            Next

            If row("is_header") = True And PlanPlaceHolder.Controls.Count > 1 Then
                Dim newLine As LiteralControl = New LiteralControl("<br/>")
                PlanPlaceHolder.Controls.Add(newLine)
            End If
            PlanPlaceHolder.Controls.Add(newRow)
        Next
    Catch ex As Exception
        clsLog.logError(ex)
    Finally
        DBConn.Close()
    End Try

EDIT 2
javascript関数でテキストボックスをどのように更新しているかを示すことも重要かもしれないと思いました

    function txtTrainingStart_Click(txtTrainingStart, txtTask) {

                var currentdate = new Date();
                var datetime = (currentdate.getMonth() + 1) + "/" + currentdate.getDate() + "/" + currentdate.getFullYear() + " " + getTimeAMPM();
                txtTrainingStart.value = datetime;
                txtTrainingStart.style.backgroundColor = "yellow";

    }
4

2 に答える 2

0

私はそれを理解しました。私は正しい軌道に乗っていましたが、Request.Formまだ使用方法を完全には理解していませんでした。

保存ボタンの新しいコード

Protected Sub imgbtnSave_Click(sender As Object, e As ImageClickEventArgs) Handles imgbtnSave.Click
    Dim coll As NameValueCollection
    coll = Request.Form

    For x = 0 To coll.Count - 1
        Response.Write("Key = " & coll.GetKey(x) & " Value = " & coll(x) & "<br />")
    Next
End Sub

ループは、すべてのコントロール キーと更新された値をポストバックから出力します。

Key = ctl00$MainContent$ctl01$txtTrainingStart Value = 8/1/13
Key = ctl00$MainContent$ctl01$txtTrainingComplete Value = 8/2/13
Key = ctl00$MainContent$ctl02$txtTrainingStart Value = 8/3/13
Key = ctl00$MainContent$ctl02$txtTrainingComplete Value = 8/4/13

非表示フィールドを使用して、動的に作成された Web ユーザー コントロールごとにデータベースの行 ID を格納します。その時点から、更新された値をデータベースに挿入するのは簡単です。

于 2013-08-08T20:28:11.303 に答える