Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用aspx页面上的C#从Gridview中的按钮更新SQL Server表_C#_Asp.net_Sql_Sql Server_Gridview - Fatal编程技术网

使用aspx页面上的C#从Gridview中的按钮更新SQL Server表

使用aspx页面上的C#从Gridview中的按钮更新SQL Server表,c#,asp.net,sql,sql-server,gridview,C#,Asp.net,Sql,Sql Server,Gridview,更新:根据katstevens的解释更新代码 我有一个表,该表使用非固定人数更新,用于跟踪出勤情况。我需要在用户单击按钮时更新表,显示他们是否到达,换句话说,当用户到达时,他们会找到自己的名字,然后单击一个按钮,该按钮将触发后面的代码,仅对其信息执行更新 我认为Gridview非常适合这样做,因为它可以适应不同数量的与会者。我发现findcontrol方法不能正常工作,因为我的update语句在itemtemplate字段中找不到标签。是否有其他方法可以做到这一点,以便代码隐藏可以找到控件,并且

更新:根据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>                

首先让我澄清一下您的问题:

许多数据绑定控件都将处理任意数量的数据行(您的“与会者数量”)——它们将不断重复,直到所有数据绑定。它们在布局和表示(网格、列表、带/不带分页等)方面有所不同,但它们的基本原则是,它们将显示您绑定到它们的行数。主要包括GridView(仅表格显示)、ListView(您设计的自定义布局,垂直或水平)和Repeater

在代码隐藏中运行的查询有一些问题。首先解析要使用的四个变量,然后创建命令。在查询中不提供任何参数,但插入了两个字符串(FIRST_NAME和LAST_NAME)。然后将这四个变量绑定到parameters集合,该集合不包含任何参数

重构代码,带说明 以
@
开头的两个占位符(
@FirstName
@LastName
)是参数,是添加到
参数
集合中的值的占位符

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
中找到(见下文),但我已经将它们保留在您需要的地方

我们不需要将
连接
绑定到
命令
,因为我们之前在
中使用()进行了绑定

    cmd.Parameters.AddWithValue("@FirstName", FIRST_NAME);
    cmd.Parameters.AddWithValue("@LastName", LAST_NAME);
cmd.Parameters.Add
在较新版本的.NET中被弃用,替换为
.AddWithValue
,它允许您同时指定参数名称和值

我们不需要绑定
@SSN\u ID
@ID
,因为它们没有在查询中指定。如果要添加这些值,需要修改命令的
UPDATE
语句以包含这些值。如果您想使用它们,请使用与上面相同的方式绑定它们

    conn.Open();
    cmd.ExecuteNonQuery();
最后,我们打开连接,然后执行查询。不需要关闭任何东西;他们将自动处理

    GridView1.DataBind();
}
然后我们重新绑定数据源以检索更新的值

在GridView中查找控件 不幸的是,当一个
GridView
呈现时,它会添加额外的容器来保存表中的数据。仔细想想,在
GridView
上运行
.FindControl()
将不起作用,因为您所寻找的控件将存在于
GridView
的每一行

为了解决您的问题,并且不让事情变得更困难,我会做以下几点:

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

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

<UpdateParameters>
    <asp:Parameter Name="First_name" />
    <asp:Parameter Name="Last_name" />
</UpdateParameters>
最后,在
GridView
上,设置
DataKeyNames=“FIRST\u NAME,LAST\u NAME”
,以便
数据源知道如何将这些值绑定到查询中

基本上,只要单击
btntkchkin
按钮,它就会发回服务器,并通过填充按钮所在行中的任何参数来运行
UpdateCommand
。这将在服务器上执行,页面将在浏览器中重新加载。我相信它也会为您在数据源上调用
DataBind
——如果不是,您可以添加一个事件处理程序来显式地执行此操作

奖金建议 就我个人而言,我会使用一个唯一的ID字段来更新签入时间,而不是匹配名字和姓氏——如果有两个同名的人,会发生什么

您可以通过使用参数占位符(@SSN\u ID,@ID)将其他字段添加到UPDATE命令中,然后将
asp:parameter
添加到
UpdateParameters
部分。如果将标签设置为
Bind()
,则运行命令时,
DataSource
将自动将标签绑定到所有查询字段


如果其中任何一项不起作用或不能解决您的问题,请留下评论。

您能从代码中发布完整的子/函数吗?当您尝试使用第一个变量时,它似乎不在范围内。最终解决了这一问题,但您的帮助确实让我朝着正确的方向前进了一大步。非常感谢你。
    GridView1.DataBind();
}
UpdateCommand="UPDATE [mytable] SET CHECK_IN = 1 where mytable.[FIRST_NAME] = @First_Name AND [mytable].[LAST_NAME] = @Last_Name"
<UpdateParameters>
    <asp:Parameter Name="First_name" />
    <asp:Parameter Name="Last_name" />
</UpdateParameters>
<asp:Button ID="btntkchkin" runat="server" CausesValidation="false" CommandName="Update" Text="Check In" OnClick="btntkchkin_Click"/>