繁体   English   中英

当我在 gridview 中有复选框时,如何更新 SQL 服务器中的数据库?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM