当我在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中的数据库?的主要内容,如果未能解决你的问题,请参考以下文章

在 Yii gridview 分页中保留复选框值

在 Gridview 中切换复选框

当我在gridview中过滤行没有找到记录时如何禁用导出按钮

使用javascript在gridview中获取复选框选中行的相应行值

使用 boundfield 时如何更新 GridView

PHP:如何存储和复选框值并更新它们