【问题标题】:How to update database in SQL Server when I have checkbox in gridview?当我在gridview中有复选框时如何更新SQL Server中的数据库?
【发布时间】: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,我怎么办?

谢谢大家

【问题讨论】:

    标签: asp.net sql-server


    【解决方案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
    

    【讨论】:

    • 感谢您的友好回复!我在我的代码中尝试了它,但它仍然无法工作。不过真的很感谢你的教诲。
    猜你喜欢
    • 1970-01-01
    • 2018-12-23
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-13
    • 2014-05-12
    • 1970-01-01
    相关资源
    最近更新 更多