0

テンプレート フィールド内にボタンを持つ GridView があります。ボタンをクリックすると、データベースにクエリを実行し、動的に作成し、フィールド (テキスト ボックスと CuteEditor) を入力し、それらの「テキスト」プロパティを私の結果に設定します。クエリ。

その時点で、更新ボタンが動的に作成されます (私は onClientClick プロパティを関数 "Update Post" に設定しています)。したがって、ユーザーがこれらの入力フィールド内のコンテンツを変更すると、データベースを更新できます。

問題は、ユーザーが GridView TemplateField 内のボタンをクリックすると、関数「UpdatePost」がトリガーされるべきではないときにトリガーされることです。

UpdatePost が時期尚早にトリガーされる原因は何ですか?

OnClientClick を削除すると問題が解決します (関数が時期尚早にトリガーされることはありません)。

GridView テンプレート フィールド内のボタンの Click 関数によって OnClientClick がトリガーされているようです

Private Function UpdatePost()
    'Find subject and Post Content
    Dim myPh As PlaceHolder = plcEditor
    Dim EditorContent As CuteEditor.Editor = plcEditor.FindControl("editEditor")
    Dim editorSubject As TextBox = plcEditor.FindControl("editorSubject")
    Dim hiddenID As HiddenField = plcEditor.FindControl("hiddenID")
    Dim connStr As String = ConfigurationManager.ConnectionStrings("oakfratnewsConnectionString").ConnectionString
    Dim nCon As New SqlConnection(connStr)
    Dim addCon As New SqlConnection(connStr)
    Dim addCom As New SqlCommand("UPDATE News SET Subject = @Subject, [Content] = @Content WHERE (ID = @ID)", addCon)
    addCom.Parameters.AddWithValue("@Subject", editorSubject.Text)
    addCom.Parameters.AddWithValue("@ID", hiddenID.Value)
    addCom.Parameters.AddWithValue("@Content", Server.HtmlDecode(EditorContent.Text))
    Try
        addCon.Open()
        addCom.ExecuteNonQuery()
        addCon.Close()
    Catch ex As Exception



    End Try

    Return True
End Function

Private Sub GridView1_RowCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs) Handles GridView1.RowCommand

    If e.CommandName = "editPost" Then
        'Remove DataGrid'''''''''
        GridView1.Visible = False
        '''''''''''''''''''''''''
        Dim index As Integer = Convert.ToInt32(e.CommandArgument)
        Dim row As GridViewRow = GridView1.Rows(index)
        Dim ID As String = GridView1.Rows(index).Cells(0).Text
        ''''''''''''''''''''''''''''''''''''''''CREATE Controls for Placeholder
        Dim editEditor As New CuteEditor.Editor
        Dim hiddenID As New HiddenField
        hiddenID.ID = "hiddenID"
        hiddenID.Value = ID
        editEditor.ID = "editEditor"
        Dim subjectTXT As New TextBox
        subjectTXT.ID = "editorSubject"
        Dim br As New Literal
        Dim editButton As New Button
        Dim sbjLabel As New Label


        sbjLabel.Text = "Subject:   "

        '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        editEditor.AutoConfigure = CuteEditor.AutoConfigure.Simple
        br.Text = "<br/><br/>"
        plcEditor.Controls.Add(hiddenID)
        plcEditor.Controls.Add(sbjLabel)
        plcEditor.Controls.Add(subjectTXT)
        subjectTXT.Width = "100"
        subjectTXT.Height = "25"
        subjectTXT.CssClass = "editInput"
        plcEditor.Controls.Add(br)
        plcEditor.Controls.Add(editEditor)
        plcEditor.Controls.Add(br)
        plcEditor.Controls.Add(br)
        plcEditor.Controls.Add(editButton)
        editButton.Text = " Submit Changes "
        editButton.Height = 40
        editButton.Width = 300
        editButton.OnClientClick = UpdatePost()

        '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        Dim connStr As String = ConfigurationManager.ConnectionStrings("oakfratnewsConnectionString").ConnectionString
        Dim nCon As New SqlConnection(connStr)
        Dim addCon As New SqlConnection(connStr)
        Dim addCom As New SqlCommand("SELECT * FROM [News] WHERE ([ID] = @ID)", addCon)
        addCom.Parameters.AddWithValue("@ID", ID)


        Dim results As SqlDataReader
        addCon.Open()
        results = addCom.ExecuteReader
        While results.Read()
            Dim editText As String = results.Item("Content")
            Dim Subject As String = results.Item("Subject")
            editEditor.Text = editText
            subjectTXT.Text = Subject
        End While
        addCon.Close()




    End If
End Sub

グリッドビュー コード

  <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
    CellPadding="3" DataKeyNames="ID" DataSourceID="SqlDataSource1" 
    Width="776px" BackColor="White" BorderColor="#D8D8D8" BorderStyle="None" 
    BorderWidth="1px">
    <Columns>
        <asp:BoundField ItemStyle-Width="30" DataField="ID" HeaderText="ID" InsertVisible="False" 
            ReadOnly="True" SortExpression="ID" />
        <asp:BoundField ItemStyle-Width="140" DataField="Subject" HeaderText="Subject" 
            SortExpression="Subject" />
        <asp:BoundField DataField="Date" HeaderText="Date Published" 
            SortExpression="Date" />
        <asp:TemplateField>

            <ItemTemplate>
                <asp:Button ID="grdEdit"  height="70" Width="200" runat="server" CommandName="editPost" CommandArgument="<%# CType(Container,GridViewRow).RowIndex %>" Text="Edit Post" />
                <asp:Button ID="Button2"  height="70" Width="200" runat="server" CommandArgument="<%# CType(Container,GridViewRow).RowIndex %>" Text="Delete Post" />
            </ItemTemplate>

        </asp:TemplateField>
    </Columns>
    <FooterStyle BackColor="White" ForeColor="Red" />
    <HeaderStyle BackColor="Green" Font-Bold="True" ForeColor="White" />
    <PagerStyle BackColor="White" ForeColor="#000066" HorizontalAlign="Left" />
    <RowStyle ForeColor="#000066" />
    <SelectedRowStyle BackColor="#669999" Font-Bold="True" ForeColor="White" />
    <SortedAscendingCellStyle BackColor="#F1F1F1" />
    <SortedAscendingHeaderStyle BackColor="#007DBB" />
    <SortedDescendingCellStyle BackColor="#CAC9C9" />
    <SortedDescendingHeaderStyle BackColor="#00547E" />
</asp:GridView>
4

1 に答える 1

1

<asp:Button />ポストバックをトリガーする HTML をレンダリングします。プロパティは JavaScript で使用するためのOnClientClickものであり、フォームを送信するデフォルト アクションをキャンセルしない場合、クライアント側のイベントとポストバックの両方が引き続き発生します。標準のボタン入力 ( ) を使用するか、プロパティに使用されている JavaScript 関数<input type="button" />を呼び出してみてください。e.preventDefault();OnClientClick

編集: ここでの本当の答えは、OnClientClickサーバー側のコードを呼び出すことを期待してプロパティを使用しようとしているということだと思います。ボタンがクリックされたときに呼び出す JavaScript 関数を指定するためのものです。呼び出される理由UpdatePostは、同じボタンがポストバックをトリガーするように自動的に配線されているためです。CommandName はそのボタンのサーバー側イベント ハンドラーの条件と一致するため、UpdatePost次のコード行で呼び出しています。

editButton.OnClientClick = UpdatePost()

そのコード行は、あなたが思っていることをしません。実際にUpdatePostメソッドを実行し、OnClientClickプロパティを の戻り値に設定していますUpdatePost

于 2012-10-12T03:55:14.173 に答える