在 Gridview 的页脚中访问链接按钮单击事件

Posted

技术标签:

【中文标题】在 Gridview 的页脚中访问链接按钮单击事件【英文标题】:Accessing Linkbutton click event in footer of Gridview 【发布时间】:2015-09-28 10:00:49 【问题描述】:

我正在处理一个 asp.net 项目,我在 default.aspx 页面上有一个 gridview,数据绑定到我的 sql 数据库。当我单击特定行时,它会导航到 details.aspx 页面,您可以在其中查看和编辑所单击行的详细信息。

在该 details.aspx 页面上是另一个网格视图,我在其中公开了页脚并添加了“插入”链接按钮以及每列的适当控件以将新记录添加到数据库中。我已经对整个项目进行了编码,但不幸的是,当我单击“插入”链接按钮时没有任何反应(控件中的文本全部清除)。不会引发异常,但不会将记录添加到数据库中。这是gridview的代码:

<asp:GridView ID="grid1" runat="server" AutoGenerateColumns="False" DataKeyNames="ClientId" DataSourceID="SqlDataSource1" ShowFooter="True" BackColor="White" BorderColor="#E7E7FF" BorderStyle="None" BorderWidth="1px" CellPadding="3" GridLines="Horizontal">
        <AlternatingRowStyle BackColor="#F7F7F7" />
        <Columns>
            <asp:CommandField ShowEditButton="True" />
            <asp:TemplateField HeaderText="ClientId" InsertVisible="False" SortExpression="ClientId">
                <EditItemTemplate>
                    <asp:Label ID="Label1" runat="server" Text='<%# Eval("ClientId") %>'></asp:Label>
                </EditItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="Label1" runat="server" Text='<%# Bind("ClientId") %>'></asp:Label>
                </ItemTemplate>
                <FooterTemplate>
                    <asp:LinkButton ID="lbInsert" runat="server" CommandName="insert" CausesValidation="false">Insert</asp:LinkButton>
                </FooterTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="FirstName" SortExpression="FirstName">
                <EditItemTemplate>
                    <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("FirstName") %>'></asp:TextBox>
                </EditItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="Label2" runat="server" Text='<%# Bind("FirstName") %>'></asp:Label>
                </ItemTemplate>
                <FooterTemplate>
                    <asp:TextBox ID="txtFirstName" runat="server"></asp:TextBox>
                </FooterTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="MiddleName" SortExpression="MiddleName">
                <EditItemTemplate>
                    <asp:TextBox ID="TextBox2" runat="server" Text='<%# Bind("MiddleName") %>'></asp:TextBox>
                </EditItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="Label3" runat="server" Text='<%# Bind("MiddleName") %>'></asp:Label>
                </ItemTemplate>
                <FooterTemplate>
                    <asp:TextBox ID="txtMiddleName" runat="server"></asp:TextBox>
                </FooterTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="LastName" SortExpression="LastName">
                <EditItemTemplate>
                    <asp:TextBox ID="TextBox3" runat="server" Text='<%# Bind("LastName") %>'></asp:TextBox>
                </EditItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="Label4" runat="server" Text='<%# Bind("LastName") %>'></asp:Label>
                </ItemTemplate>
                <FooterTemplate>
                    <asp:TextBox ID="txtLastName" runat="server"></asp:TextBox>
                </FooterTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Gender" SortExpression="Gender">
                <EditItemTemplate>
                    <asp:TextBox ID="TextBox4" runat="server" Text='<%# Bind("Gender") %>'></asp:TextBox>
                </EditItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="Label5" runat="server" Text='<%# Bind("Gender") %>'></asp:Label>
                </ItemTemplate>
                <FooterTemplate>
                    <asp:DropDownList ID="ddGender" runat="server">
                        <asp:ListItem>M</asp:ListItem>
                         <asp:ListItem>F</asp:ListItem>
                    </asp:DropDownList>
                </FooterTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="DateOfBirth" SortExpression="DateOfBirth">
                <EditItemTemplate>
                    <asp:TextBox ID="TextBox5" runat="server" Text='<%# Bind("DateOfBirth") %>'></asp:TextBox>
                </EditItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="Label6" runat="server" Text='<%# Bind("DateOfBirth") %>'></asp:Label>
                </ItemTemplate>
                <FooterTemplate>
                    <asp:TextBox ID="txtDOB" runat="server"></asp:TextBox>
                </FooterTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="ZipCode" SortExpression="ZipCode">
                <EditItemTemplate>
                    <asp:TextBox ID="TextBox6" runat="server" Text='<%# Bind("ZipCode") %>'></asp:TextBox>
                </EditItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="Label7" runat="server" Text='<%# Bind("ZipCode") %>'></asp:Label>
                </ItemTemplate>
                <FooterTemplate>
                    <asp:TextBox ID="txtZIP" runat="server"></asp:TextBox>
                </FooterTemplate>
            </asp:TemplateField>
        </Columns>
        <FooterStyle BackColor="#B5C7DE" ForeColor="#4A3C8C" />
        <HeaderStyle BackColor="#4A3C8C" Font-Bold="True" ForeColor="#F7F7F7" />
        <PagerStyle BackColor="#E7E7FF" ForeColor="#4A3C8C" HorizontalAlign="Right" />
        <RowStyle BackColor="#E7E7FF" ForeColor="#4A3C8C" />
        <SelectedRowStyle BackColor="#738A9C" Font-Bold="True" ForeColor="#F7F7F7" />
        <SortedAscendingCellStyle BackColor="#F4F4FD" />
        <SortedAscendingHeaderStyle BackColor="#5A4C9D" />
        <SortedDescendingCellStyle BackColor="#D8D8F0" />
        <SortedDescendingHeaderStyle BackColor="#3E3277" />
    </asp:GridView>

这里是代码隐藏:

 Private Sub grid1_RowCommand1(sender As Object, e As GridViewCommandEventArgs) Handles grid1.RowCommand
    If e.CommandName = "insert" Then
        SqlDataSource1.InsertParameters("FirstName").DefaultValue = DirectCast(grid1.FooterRow.FindControl("txtFirstName"), TextBox).Text
        SqlDataSource1.InsertParameters("MiddleName").DefaultValue = DirectCast(grid1.FooterRow.FindControl("txtMiddleName"), TextBox).Text
        SqlDataSource1.InsertParameters("LastName").DefaultValue = DirectCast(grid1.FooterRow.FindControl("txtLastName"), TextBox).Text
        SqlDataSource1.InsertParameters("Gender").DefaultValue = DirectCast(grid1.FooterRow.FindControl("ddGender"), DropDownList).SelectedValue
        SqlDataSource1.InsertParameters("DateOfBirth").DefaultValue = DirectCast(grid1.FooterRow.FindControl("txtDOB"), TextBox).Text
        SqlDataSource1.InsertParameters("ZipCode").DefaultValue = DirectCast(grid1.FooterRow.FindControl("txtZIP"), TextBox).Text

        SqlDataSource1.Insert()


    End If
End Sub

感谢您为解决此问题提供的任何帮助!

约翰

【问题讨论】:

如果你在grid1_RowCommand1 上设置了一个断点,当你点击链接按钮时你会点击它吗? 是的,断点被命中。 假设所有参数都有正确的预期值,你应该没问题。仔细检查输入并将插入包装在 try/catch 中,并在 catch 中放置一个断点。另外-您可以发布sqldatasource标记的相关部分 【参考方案1】:

DefaultValue 不设置应该插入的值,而是为不允许它们的类型(整数、长整数等)的空值提供解析。请参阅 this link 了解有关该属性的更多信息。

您要做的是在 SqlDataSource 中使用 Control Parameters 将 TextBox 的值绑定到 InsertCommand 使用的参数。举个例子:

<asp:sqldatasource id="SqlDataSource1" runat="server" connectionstring="<%$ ConnectionStrings:YourConnection%>"
      insertcommand="INSERT INTO SomeTable (FirstName, MiddleName) VALUES (@FirstName, @MiddleName)">
      <insertparameters>
          <asp:controlparameter name="FirstName" controlid="txtFirstName" propertyname="Text"/>
          <asp:controlparameter name="MiddleName" controlid="txtLastName" propertyname="Text"/>           
      </insertparameters>
</asp:sqldatasource>

那么你的 grid1_RowCommand1 方法就变得更干净了:

Private Sub grid1_RowCommand1(sender As Object, e As GridViewCommandEventArgs) Handles grid1.RowCommand

    If e.CommandName = "insert" Then

        SqlDataSource1.Insert()

    End If

End Sub

【讨论】:

您可能想测试一下 - 我很确定数据源将无法找到附加到您的插入参数的控件,因为它们位于 gridview 中并且不属于gridview 源数据集。 See this

以上是关于在 Gridview 的页脚中访问链接按钮单击事件的主要内容,如果未能解决你的问题,请参考以下文章

在 WebGrid Mvc3 的页脚添加链接按钮

表格视图部分 Swift3 的页脚中的按钮

在 Word 文档的页脚中访问 ContentControl(组合框)

在heroku上部署的rails应用程序和html代码出现在我的页脚中

图标不会显示在台式计算机的页脚中

为啥将 JavaScript 放在页面的页脚中?