使用aspx页面上的C#从Gridview中的按钮更新SQL Server表
更新:根据katstevens的解释更新代码 我有一个表,该表使用非固定人数更新,用于跟踪出勤情况。我需要在用户单击按钮时更新表,显示他们是否到达,换句话说,当用户到达时,他们会找到自己的名字,然后单击一个按钮,该按钮将触发后面的代码,仅对其信息执行更新 我认为Gridview非常适合这样做,因为它可以适应不同数量的与会者。我发现findcontrol方法不能正常工作,因为我的update语句在itemtemplate字段中找不到标签。是否有其他方法可以做到这一点,以便代码隐藏可以找到控件,并且视图将能够显示所有与会者,而不管有多少人 此特定代码返回此错误:CS0103:名称“FIRST_name”在当前上下文中不存在 这是(许多人)的最新尝试,以防万一它是可以修复的 代码隐藏:注释掉 以下是sqldatasourcecontrol:使用aspx页面上的C#从Gridview中的按钮更新SQL Server表,c#,asp.net,sql,sql-server,gridview,C#,Asp.net,Sql,Sql Server,Gridview,更新:根据katstevens的解释更新代码 我有一个表,该表使用非固定人数更新,用于跟踪出勤情况。我需要在用户单击按钮时更新表,显示他们是否到达,换句话说,当用户到达时,他们会找到自己的名字,然后单击一个按钮,该按钮将触发后面的代码,仅对其信息执行更新 我认为Gridview非常适合这样做,因为它可以适应不同数量的与会者。我发现findcontrol方法不能正常工作,因为我的update语句在itemtemplate字段中找不到标签。是否有其他方法可以做到这一点,以便代码隐藏可以找到控件,并且
<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"/>