在asp.net中的gridview内部,checkchanged不会触发

时间:2015-04-01 10:30:56

标签: c# asp.net gridview checkbox

我有一个gridview,里面是一个项目状态的复选框, 复选框有checkchanged事件,但是当我试图检查或取消选中它时,checkchanged没有触发。

这里是gridview的代码,里面有复选框

 <asp:GridView ID="dgvItems" runat="server" OnRowCreated="dgvItems_RowCreated" OnRowDataBound="dgvItems_RowDataBound" OnSelectedIndexChanged="dgvItems_SelectedIndexChanged" OnRowDeleting="dgvItems_RowDeleting">
   <Columns>
       <asp:TemplateField HeaderText ="Status">
           <ItemTemplate>
              <asp:CheckBox ID="chkStatus" runat="server" Checked = <%# (string)Eval("item_status") == "Active" ? true : false %> OnCheckedChanged="chkStatus_CheckedChanged" AutoPostBack="True" />
           </ItemTemplate>
       </asp:TemplateField>
   </Columns>
</asp:GridView>

 protected void chkStatus_CheckedChanged(object sender, EventArgs e)
    {
        GridViewRow row = dgvItems.SelectedRow;
        string item_id = row.Cells[0].Text.ToString();

        con.Open();
        SqlCommand cmd = new SqlCommand("Update Items set item_status = 'Inactive' where item_id = @item_id ",con);
        cmd.Parameters.AddWithValue("@item_id", cmd);
        cmd.ExecuteNonQuery();

        con.Close();
    }

提前致谢!

2 个答案:

答案 0 :(得分:1)

我想到了两件事:

  1. 您的Page_Load不会处理IsPostBack - 属性,因此您始终会对网格进行数据绑定,即使在回发时也是如此。这可以防止事件发生。
  2. GridViewRow row = dgvItems.SelectedRow;null
  3. 使用此代码从已检查的GridViewRow

    中获取CheckBox
    CheckBox chkStatus = (CheckBox) sender;
    GridViewRow row = (GridViewRow) chkStatus.NamingContainer;
    

答案 1 :(得分:0)

如果您的选中状态最初为false,则再次将其设置为false不会触发CheckedChanged事件。 这是因为检查状态实际上没有改变

这是尝试设置CheckBox1.Checked属性

时使用的内部代码
public void set_Checked(bool value)
{
if (value != this.Checked)
{
    this.CheckState = value ? CheckState.Checked : CheckState.Unchecked;
}
}