使用带有C#的aspview页面上的Gridview按钮更新SQL Server表

时间:2014-04-21 23:29:03

标签: c# asp.net sql sql-server gridview

更新:根据katstevens说明更新代码。

我有一张表格,该表格使用非固定数量的人来更新,用于跟踪出勤情况。我需要在用户点击带有天气的按钮时更新表格,换句话说,当用户到达时他们找到他们的名字并点击一个按钮,该按钮应该触发后面的代码,仅对他们的信息进行更新。

我认为Gridview对此非常理想,因为它可以适应不同数量的与会者。我发现findcontrol方法不能正常工作,因为我的update语句在itemtemplate字段中找不到标签。有没有其他方法可以做到这一点,以便后面的代码可以找到控制和视图将能够显示所有参与者,无论多少?

此特定代码返回此错误:CS0103:名称' FIRST_NAME'在当前上下文中不存在

这是最近的尝试(很多),以防万一。

代码背后:注释掉

这是sqldatasourcecontrol:

<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:myconnection %>"
    UpdateCommand="UPDATE mytable SET CHECK_IN = 1 where mytable.[ID] = @lbl_ID"
    SelectCommand="select command stuff...

    <SelectParameters>
        <asp:ControlParameter ControlID="more select stuff..." PropertyName="SelectedValue" />
    </SelectParameters>
    <UpdateParameters>
        <asp:Parameter Name="LBL_ID" />
    </UpdateParameters>
</asp:SqlDataSource>                

这是按钮:

                <asp:TemplateField ShowHeader="False">
                    <ItemTemplate>
                        <asp:Button ID="btntkchkin" runat="server" CausesValidation="false" CommandName="Update"
                            Text="Check In" OnClick="btntkchkin_Click" />
                    </ItemTemplate>
                </asp:TemplateField>

1 个答案:

答案 0 :(得分:2)

首先让我澄清你的问题的几点:

许多数据绑定控件都将处理任意数量的数据行(您的与会者人数&#39;) - 他们将一直重复,直到所有数据都被绑定。它们在布局和表示方面有所不同(网格,列表,有/无分页等),但它们的基本原则是它们在绑定时会显示多行或几行。这些包括 GridView (仅限表格显示), ListView (您设计的自定义布局,垂直或水平)和 Repeater

在后面的代码中运行的查询存在一些问题。首先解析我们要使用的四个变量,然后创建命令。您不会在查询中提供任何参数,但会注入2个字符串(FIRST_NAME和LAST_NAME)。然后将四个变量绑定到参数集合,该集合不包含任何参数。

重构代码,带说明

string CommandText = "UPDATE [mytable] SET CHECK_IN = 1 where mytable.[FIRST_NAME] = @FirstName and[mytable].[LAST_NAME] = @LastName";

@@FirstName@LastName)开头的两个占位符是参数,是您添加到Parameters集合的值的占位符

using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["myconnection"].ConnectionString))
using (SqlCommand cmd = new SqlCommand(CommandText, conn))
{

最好将连接和命令包装在使用块中,以便在完成时正确处理它们。将它们放在另一个上面意味着同一组{ }适用于两者。

    string FIRST_NAME = ((Label)(GridView1.FindControl("lbl_FIRST_NAME")));
    string LAST_NAME = ((Label)(GridView1.FindControl("lbl_LAST_NAME")));
    string SESSION_ID = ((Label)(GridView1.FindControl("lbl_SESSION_ID")));
    string ID = ((Label)(GridView1.FindControl("lbl_ID"))).Text;

你实际上并不需要这些变量,而且直接在GridView中找不到它们(见下文),但是如果你不管怎样我还是留下了它们需要他们。

我们不需要将Connection绑定到Command,因为我们之前在using()块中执行了此操作。

    cmd.Parameters.AddWithValue("@FirstName", FIRST_NAME);
    cmd.Parameters.AddWithValue("@LastName", LAST_NAME);

cmd.Parameters.Add在较新版本的.NET中已被弃用,由.AddWithValue取代,后者允许您同时指定参数名称和值。

我们不需要绑定@SSN_ID@ID,因为它们未在查询中指定。如果要添加它们,则需要修改命令的UPDATE语句以包含这些值。如果要使用它们,请按照与上面相同的方式绑定它们。

    conn.Open();
    cmd.ExecuteNonQuery();

最后我们打开连接然后执行查询。无需关闭任何东西;他们会自动处理。

    GridView1.DataBind();
}

然后我们重新绑定数据源以检索更新的值。

在GridView中查找控件

不幸的是,当GridView呈现时,它会添加额外的容器来保存表中的数据。如果您考虑一下,在.FindControl()上运行GridView将无法正常工作,因为您寻找的控件将存在于GridView的每一行。

要解决您的问题,而不是让事情变得比他们需要的更难,我会做以下事情:

向数据源添加UpdateCommand,使用相关数据更新相关行(当前时间,签入标记,等等):

UpdateCommand="UPDATE [mytable] SET CHECK_IN = 1 where mytable.[FIRST_NAME] = @First_Name AND [mytable].[LAST_NAME] = @Last_Name"

将两个参数添加到UpdateParameters部分,以便在运行查询时绑定值。

<UpdateParameters>
    <asp:Parameter Name="First_name" />
    <asp:Parameter Name="Last_name" />
</UpdateParameters>

然后将按钮的CommandName设置为Update,以便它触发行上的更新事件。

<asp:Button ID="btntkchkin" runat="server" CausesValidation="false" CommandName="Update" Text="Check In" OnClick="btntkchkin_Click"/>

最后,在GridView上设置DataKeyNames="FIRST_NAME, LAST_NAME",以便DataSource知道将这些值绑定到查询中。

基本上会发生什么是每当点击btntkchkin按钮时,它将回发到服务器并通过填充按钮所在行中的任何参数来运行UpdateCommand。这将在服务器,页面将在浏览器中重新加载。我相信它也会为你调用DataBind数据源 - 如果没有,你总是可以添加一个事件处理程序来明确地做到这一点。

奖金建议

我个人会使用一个唯一ID字段来更新Checked In时间,而不是匹配First和Last名称 - 如果你有两个同名的人会怎么样?

您可以将其他字段(SSN_ID,ID)添加到UPDATE命令中,方法是将其添加到参数占位符(@SSN_ID,@ ID)中,然后将asp:Parameter添加到UpdateParameters部分。如果您的标签设置为Bind(),则DataSource会在您运行命令时自动将它们绑定到所有查询字段。

如果其中任何一项无效或无法解决您的问题,请发表评论。