1

私はこのグリッドビューを持っていますが、その中のボタンの何が問題なのかわかりません。私はこのaspコードを持っています:

<asp:GridView ID="gvList" runat="server">
            <Columns>
                <asp:TemplateField HeaderText="User Name" HeaderStyle-ForeColor="Black"  HeaderStyle-Font-Bold="true">
                    <ItemTemplate>
                        <asp:Label runat="server" ID="lblUsername" Text='<%# Eval("cUserName") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="Dept User" HeaderStyle-ForeColor="Black"  HeaderStyle-Font-Bold="true">
                    <ItemTemplate>
                        <asp:Label runat="server" ID="lblDept" Text='<%#  iif(Eval("lDeptUser"),"Yes","No")  %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="Actions" HeaderStyle-ForeColor="black" HeaderStyle-Font-Bold="true">
                    <ItemTemplate>
                        <asp:Button  ID="btnedit" runat="server" Text="Edit" />
                        <asp:Button ID="btnDelete" OnClick="DeleteRow" runat="server" Text="Delete" />
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
            </asp:GridView>

そして、任意の行で削除または編集を押すと、エラーが発生します!!Invalid postback or callback argument.

これはvb.netのサーバー側コードです。

Public Function GetList() As DataTable
    Dim Query As String = "Select cUserName,lDeptUser FROM Intranet.dbo.Gn_ISCoordinators"
    Dim dt As DataTable = New DataTable()
    Using adapter = New SqlDataAdapter(Query, ConfigurationManager.ConnectionStrings("IntranetConnectionString").ConnectionString)
        adapter.Fill(dt)
        gvList.DataSource = dt
        gvList.DataBind()
        Return dt
    End Using

End Function

Public Function DelRow() As DataTable

    Dim strusername As String = CType(gvList.FindControl("lblUsername"), Label).Text.Trim()

    Dim Query As String = "Delete FROM Intranet.dbo.Gn_ISCoordinators where cUserName='" & strusername & "'"
    Dim dt As DataTable = New DataTable()
    Using Adapter = New SqlDataAdapter(Query, ConfigurationManager.ConnectionStrings("IntranetConnectionString").ConnectionString)
        Adapter.Fill(dt)
        Return dt
    End Using

End Function

Protected Sub DeleteRow(ByVal sender As Object, ByVal e As System.EventArgs)
    DelRow()
End Sub

Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load
    GetList()

End Sub

Protected Sub gv(sender As Object, e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles gvList.RowDataBound
    e.Row.Cells(3).Visible = False
    e.Row.Cells(4).Visible = False


End Sub

End Class

クライアント側からだと思います。この問題で私を助けてください。ところで、私は今までajaxtoolkitを使用しておらずEnableEventValidation="true"、ページとweb.configにあります

問題とその解決策は何ですか、私を助けてください。

前もって感謝します。

4

2 に答える 2

1

まず、コードを次のようにラップしますPage_Load

If Not IsPostBack Then GetList()

したがって、ポストバックではなく、最初のロードでグリッドをデータバインドするだけです。その状態はデフォルトで維持さViewwStateれます。

の次の問題は、 を介してDeleteRowラベルを見つけようとしています。しかし、には1 つだけでなく複数の行 (およびラベル) が含まれているためです。FindControlGridViewNamingContainerGridViewRowGridView

したがって、最初に行への参照を取得する必要があります。の を使用するだけNamingContainerですButton:

Dim btn = DirectCast(sender, Button)
Dim row = DirectCast(btn.NamingContainer, GridViewRow)
Dim lblUsername = DirectCast(row.FindControl("lblUsername"), Label)
' ... '
于 2013-03-14T10:16:00.577 に答える
1

この関数呼び出しは使用できません。なぜなら

CType(gvList.FindControl("lblUsername"), Label).Text.Trim()

ボタン クリック イベントでのみ許可されます。したがって、ボタン クリック イベント自体内の関数コードを実行します。

于 2013-03-14T10:11:11.867 に答える