当我在gridview中有复选框时如何更新SQL Server中的数据库?
Posted
技术标签:
【中文标题】当我在gridview中有复选框时如何更新SQL Server中的数据库?【英文标题】:How to update database in SQL Server when I have checkbox in gridview? 【发布时间】:2022-01-13 03:32:54 【问题描述】:我试着做一个留言板。
有人留言后,管理员可以查看消息上下文是否可以显示给其他人。
我使用gridView 连接到我的SQL Server 数据,并且gridview 中有一个复选框。
如果我选中复选框,然后单击“发送”按钮,SQL Server 数据将被更新。
如果我想将复选框结果更新为 SQL Server 数据,我应该怎么做?
这是我的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();
如果我使用for,它会显示关于“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,我怎么办?
谢谢大家
【问题讨论】:
【参考方案1】:好的,它的工作方式是 GV 中的数据字段(非模板列)使用 cells[] 集合。
但是,对于模板列,我们必须使用查找控件。
我们还将使用数据键功能,因为这让我们可以拥有/使用/使用数据库 PK 行 ID,但不必在标记/网格中为用户显示。
好的,这是一个包含两个数据文件(cells())和复选框的 GV。
我们将选中复选框,然后使用保存按钮将更改发送回数据库。
所以,我们的标记:
<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 行拉到一个数据表中,并对数据库执行一次数据表更新。但是,正如上面的代码所示 - 我们实际上保持连接打开以进行更新 - 因此无论哪种方式都没什么大不了的。
【讨论】:
天哪!我做到了!!!!!非常感谢!!!!我想了几天这个问题,现在终于做到了!我不知道如何表达我的兴奋和感激。还有一个问题我想检查一下。在gridview中,Checked='' />和Checked='' />哪个更好?我检查了一些信息,它说 eval 是只读的。我很困惑如果我使用eval它会无法响应sql数据吗? 我不确定它是否有区别,但我总是使用 Eval(),而且它有效 - 所以使用 Eval("column name")。这不是只读的,但 Eval() 或 bind() 不会自动为您将数据放回数据库 - 无论如何您都必须编写代码。因此,当您必须编写代码将值放回原处时,我更喜欢并建议使用 Eval()。 (我们正在编写代码来更新数据库,因此,使用 Eval() 而非绑定。 我明白了!感谢您的友好回复。从现在开始我将使用 Eval()。【参考方案2】:请检查此代码
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
【讨论】:
感谢您的友好回复!我在我的代码中尝试了它,但它仍然无法工作。不过真的很感谢你的教诲。以上是关于当我在gridview中有复选框时如何更新SQL Server中的数据库?的主要内容,如果未能解决你的问题,请参考以下文章
当我在gridview中过滤行没有找到记录时如何禁用导出按钮