[英]How to update database in SQL Server when I have checkbox in gridview?
我试着做一个留言板。
有人留言后,管理员可以检查消息上下文是否可以显示给其他人。
我用gridView连接我的SQL服务器数据,在gridview中有一个复选框。
如果我选中复选框,然后单击“发送”按钮,SQL 服务器数据将被更新。
如果我想将复选框结果更新为 SQL 服务器数据,我该怎么办?
这是我的aspx
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="id" OnRowDeleting="GridView1_RowDeleting">
<Columns>
<asp:TemplateField HeaderText="check or not" SortExpression="replyCheck">
<EditItemTemplate>
<asp:CheckBox ID="CheckBox1" runat="server" Checked='<%# Bind("replyCheck") %>' />
</EditItemTemplate>
<ItemTemplate>
<asp:CheckBox ID="CheckBox2" runat="server" Checked='<%# Bind("replyCheck") %>' Enabled="True" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<br/>
<asp:Button ID="Button1" runat="server" Text="sent" OnClick="Button1_Click"/>
这是我的 aspx.cs - 如果我使用 foreach,它无法更新到我的数据库中
protected void Button1_Click(object sender, EventArgs e)
{
var id = GridView1.DataKeys.ToString();
foreach (GridViewRow row in GridView1.Rows)
{
CheckBox reply = (row.Cells[0].FindControl("CheckBox2") as CheckBox);
if (reply.Checked)
{
SqlConnection sqlConnection = new SqlConnection(getsql);
sqlConnection.Open();
SqlCommand cmd = new SqlCommand($"UPDATE reply SET replyCheck ='1' WHERE (id = {id})", sqlConnection);
cmd.ExecuteNonQuery();
sqlConnection.Close ();
DataBind();
}
}
}
如果我使用它,它会显示有关“datakey array”的错误
protected void Button1_Click(object sender, EventArgs e)
{
var id = GridView1.DataKeys.ToString();
int messageCheck, displayCheck;
SqlConnection sqlConnection = new SqlConnection(getsql);
sqlConnection.Open();
for (int i = 0; i < GridView1.Rows.Count; i++)
{
CheckBox message = (CheckBox)GridView1.Rows[i].FindControl("CheckBox2");
if (message.Checked == true)
{
messageCheck = 1;
SqlCommand cmd1 = new SqlCommand($"UPDATE reply SET replyCheck = {messageCheck} WHERE (id = {id})", sqlConnection);
cmd1.ExecuteNonQuery();
}
else
{
messageCheck = 0;
SqlCommand cmd2 = new SqlCommand($"UPDATE reply SET replyCheck = {messageCheck} WHERE (id = {id})", sqlConnection);
cmd2.ExecuteNonQuery();
}
}
sqlConnection.Close();
}
如果没有 javascript,我该怎么办?
谢谢大家
请检查此代码
Protected Sub Button1_Click(sender As Object, e As EventArgs)
For Each row In GridView1.Rows
Dim chk As CheckBox = row.FindControl("CheckBox2")
If chk.Checked Then
'sql update query
Else
End If
Next
End Sub
好的,它的工作方式是 GV 中的数据字段(非模板列)使用 cells[] 集合。
但是,对于模板列,我们必须使用查找控件。
我们还将使用数据键功能,因为这让我们拥有/使用/使用数据库 PK 行 ID,但不必在标记/网格中为用户显示。
好的,这是一个包含两个数据文件(cells())和复选框的 GV。
我们将 select 的复选框,然后用保存按钮,将更改发送回数据库。
所以,我们的标记:
<div style="width:50%;padding:25px">
<asp:GridView ID="GVHotels" runat="server" class="table borderhide"
AutoGenerateColumns="false" DataKeyNames="ID">
<Columns>
<asp:BoundField DataField="FirstName" HeaderText="FirstName" />
<asp:BoundField DataField="LastName" HeaderText="LastName" />
<asp:BoundField DataField="City" HeaderText="City" />
<asp:BoundField DataField="HotelName" HeaderText="HotelName" HeaderStyle-Width="200" />
<asp:BoundField DataField="Description" HeaderText="Description" />
<asp:TemplateField HeaderText="Smoking" ItemStyle-HorizontalAlign="Center" >
<ItemTemplate>
<asp:CheckBox ID="chkSmoking" runat="server"
Checked='<%# Eval("Smoking") %>' />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Balcony" ItemStyle-HorizontalAlign="Center" >
<ItemTemplate>
<asp:CheckBox ID="chkBalcony" runat="server"
Checked='<%# Eval("Balcony") %>' />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<asp:Button ID="cmdSave" runat="server" Text="Save changes" CssClass="btn"/>
</div>
现在我们要在上面填写的代码可以这样说:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
LoadGrid();
}
void LoadGrid()
{
using (SqlConnection con = new SqlConnection(Properties.Settings.Default.TEST4))
{
using (SqlCommand cmdSQL =
new SqlCommand("SELECT * from tblHotels ORDER BY HotelName ", con))
{
con.Open();
GVHotels.DataSource = cmdSQL.ExecuteReader();
GVHotels.DataBind();
}
}
}
现在我们看到了:
现在,有两种方法可以更新数据库。 事实上,我们可以使用数据表进行更新,并一次性更新数据库。
但是,我们只是循环 GV,并执行更新。 (如果我有时间,我会尝试发布第二个更酷的方法)。
因此,我们更新/保存更改的按钮(用于复选框)。 可能是这样的:
protected void cmdSave_Click(object sender, EventArgs e)
{
using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.TEST4))
{
conn.Open();
string strSQL = "UPDATE tblHotels Set Smoking = @S, Balcony = @B " +
"WHERE ID = @ID";
foreach (GridViewRow gRow in GVHotels.Rows)
{
CheckBox cSmoke = (CheckBox)gRow.FindControl("chkSmoking");
CheckBox cBlacony = (CheckBox)gRow.FindControl("chkBalcony");
int PKID = (int)GVHotels.DataKeys[gRow.RowIndex]["ID"];
using (SqlCommand cmdSQL = new SqlCommand(strSQL, conn))
{
cmdSQL.Parameters.Add("@S", SqlDbType.Bit).Value = cSmoke.Checked;
cmdSQL.Parameters.Add("@B", SqlDbType.Bit).Value = cBlacony.Checked;
cmdSQL.Parameters.Add("@ID", SqlDbType.Int).Value = PKID;
cmdSQL.ExecuteNonQuery();
}
}
}
}
注意我们如何使用行索引来获取 PK 行 ID。 注意 GV 的 DataKeys 设置。 这允许您使用/拥有/享受使用数据库 PK 行 ID(在此代码示例中命名为“ID”),而不必在 GV 显示中显示/包含 PK。
请注意,您将继续对非模板列使用 cells() 集合。 但是对于任何模板列 - 您必须在该行上使用 FindControl,取出控件,然后您就可以使用该控件值。
我们还可以将每个 GV 行拉入一个数据表,并对数据库执行一次数据表更新。 但是,正如上面的代码所示——我们实际上保持连接打开以进行更新——因此无论哪种方式都没什么大不了的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.