更新:根据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>
答案 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
呈现时,它会添加额外的容器来保存表中的数据。如果您考虑一下,在.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
会在您运行命令时自动将它们绑定到所有查询字段。
如果其中任何一项无效或无法解决您的问题,请发表评论。