首页 > 解决方案 > asp.net:如何通过特定行中的复选框更新 GridView 中的数据

问题描述

我正在开发一个 Web 表单,在其中显示带有数据的 Gridview。其中一列由 CheckBox 组成。如何更新特定行中的数据。

所以我的问题是:

当用户选中或取消选中复选框时,如何识别特定行并使用 UPDATE 发送 sql 请求?

更新:这是我的代码。它不会更新 CheckBox 的值。命名空间:

public partial class Call_Bills : System.Web.UI.Page
{
    SqlConnection con = new SqlConnection();
    string check;
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void Button_Submit(object sender, EventArgs e)
     {
         foreach (GridViewRow row in GridView2.Rows)
         {
             con.ConnectionString = ConfigurationManager.ConnectionStrings["TestDeductionsConnectionString2"].ToString();
             con.Open();
             bool private1 = (row.FindControl("CheckBox1") as CheckBox).Checked;
             if (private1 == true)
             {
                 check = "1";
             }
             else
             {
                 check = "0";
             }
             SqlCommand cmd = new SqlCommand("insert into DetailCosts(private) values(@private)", con);
             cmd.Parameters.AddWithValue("@private", check);
             cmd.ExecuteNonQuery();
         }}

GridView 的名称是:GridView2;表中复选框的名称:私有;Gridview 中 CheckBox 的 id 为:

<asp:TemplateField HeaderText="Private" SortExpression="private">
                                    <ItemTemplate>
                                        <asp:CheckBox ID="CheckBox1" runat="server" Checked='<%# Eval("private") %>'  />
                                    </ItemTemplate>
                                    <HeaderStyle HorizontalAlign="Center" />
                                </asp:TemplateField>

标签: c#asp.net.netvisual-studiowebforms

解决方案


您可以手动定义一种方法来处理由 gridview 列内的控件生成的回发。为此,您只需添加标签AutoPostBack=TrueOnCheckedChanged=YourMethodName控件。

在代码隐藏中,将此方法定义为 public void,并定义通常存在的参数(sender 作为对象,e 作为 EventArgs),例如:

public void YourMethodName(object sender, EventArgs e)

在该方法上,您可能需要获取包含已生成事件的控件的 GridViewRow。为此,只需解析 sender 参数(将是复选框)并获取 2 个父级别(GridViewCell 和 GridViewRow),它将类似于:

GridViewRow row = ((CheckBox)sender).parent.parent;

由于您拥有该行,因此您可以使用 FindControl 方法获得其中的任何控件。如果您需要一个 id 来标识正在更新的实体,您可以将其存储在行内的隐藏字段中。

希望能帮助到你!


推荐阅读